【问题标题】:Mongoose 5.0.16, Getting Cannot read property 'replace' of undefinedMongoose 5.0.16,获取无法读取未定义的属性“替换”
【发布时间】:2018-10-06 13:32:39
【问题描述】:

我创建了一个新的 Node、Express、Mongo 应用程序,但在设置 MongoDB 时突然出现 Mongoose 错误。

Server Listening to Port: 9001 
C:\Users\Sarwin\Desktop\Sarwin\Projects\SchoolProject\node_modules\mongoose\node_modules\mongodb-core\lib\auth\scram.js:130
username = username.replace('=', '=3D').replace(',', '=2C');
                   ^

TypeError:无法读取未定义的“替换”属性

 at executeScram (C:\Users\Sarwin\Desktop\Sarwin\Projects\SchoolProject\node_modules\mongoose\node_modules\mongodb-core\lib\auth\scram.js:130:24)
 at C:\Users\Sarwin\Desktop\Sarwin\Projects\SchoolProject\node_modules\mongoose\node_modules\mongodb-core\lib\auth\scram.js:299:7
 at _combinedTickCallback (internal/process/next_tick.js:73:7)
 at process._tickCallback (internal/process/next_tick.js:104:9) [nodemon] app crashed - waiting for file changes before starting...

我设置 MongoDB 的代码是:

const session    = require('express-session');
const mongoose   = require('mongoose');
const mongoStore = require('connect-mongo')(session);

// Local connection
let mongoConnectionLocal = { 
    'url': `mongodb://${process.env.MongoDBLocalUser}:${process.env.MongoDBLocalPassword}@127.0.0.1:27017/my-database`
};    

mongoose.connect(mongoConnectionLocal.url, {auth:{authdb:"admin"}}, err => { if(err) { console.log(err); }});

这太奇怪了,因为这段代码适用于 Mongoose 4.13.2 及更低版本(我尝试卸载 5.0.16 版本,然后安装 4.13.2 版本,它可以正常工作)。 Mongoose 实现 MongoDB 连接有什么变化吗?

更新:有人说使用默认值,使用默认值会产生这个错误:

 default: mongoose.connect(mongoConnectionLocal.url, err => { if(err) { console.log(err); }});

{ MongoError: Authentication failed.
at C:\Users\Sarwin\Desktop\Sarwin\Projects\SchoolProject\node_modules\mongoose\node_modules\mongodb-core\lib\connection\pool.js:598:61
at authenticateStragglers (C:\Users\Sarwin\Desktop\Sarwin\Projects\SchoolProject\node_modules\mongoose\node_modules\mongodb-core\lib\connection\pool.js:516:16)
at Connection.messageHandler (C:\Users\Sarwin\Desktop\Sarwin\Projects\SchoolProject\node_modules\mongoose\node_modules\mongodb-core\lib\connection\pool.js:552:5)
at emitMessageHandler (C:\Users\Sarwin\Desktop\Sarwin\Projects\SchoolProject\node_modules\mongoose\node_modules\mongodb-core\lib\connection\connection.js:309:10)
at Socket.<anonymous> (C:\Users\Sarwin\Desktop\Sarwin\Projects\SchoolProject\node_modules\mongoose\node_modules\mongodb-core\lib\connection\connection.js:452:17)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:551:20)
name: 'MongoError',
message: 'Authentication failed.',
ok: 0,
errmsg: 'Authentication failed.',
code: 18,
codeName: 'AuthenticationFailed' }
(node:20124) UnhandledPromiseRejectionWarning: Unhandled promise rejection 
(rejection id: 1): MongoError: Authentication failed.

【问题讨论】:

  • 底层MongoClient 将尝试对admin 进行身份验证默认情况下。应该没有必要将其实际包含在连接选项中。仅当您在另一个数据库中创建用户时才需要它,并且您确实“应该”在 admin 数据库中定义所有用户,并根据需要简单地授予其他数据库的权限。
  • 选项应该是{ authSource: 'admin' }。但如前所述,你真的根本不需要这个。 “更改”在底层核心驱动程序中,mongodb://&lt;host&gt;/&lt;dbname&gt; 现在实际上用&lt;dbname&gt; 部分标识“授权”数据库。 mongoose now 所做的是从连接字符串中删除您的my-database,然后在返回响应之前在代码中切换所选数据库。这就是现在所有司机的做法。
  • 问题是它在较低版本的 Mongoose 上正常工作,例如 4.13.2 版本,所以默认情况下在 Mongoose 5.0.16 上设置了管理员身份验证?谢谢。
  • 猫鼬版本之间的不同“核心驱动程序”。从 2.x 更改为 3.x。不再支持各种选项。但是“再次”,您不需要指定“admin”作为授权源。 admin 上的身份验证始终 是默认设置。
  • 我认为您在这里缺少的是您的“早期”选项实际上是不正确的并且被忽略了。因此,您的用户很可能是在my-database 命名空间中错误地创建的,这也是我一直在告诉您的。可能{ authSource: 'my-database' } 工作得很好。但实际上,您应该更正定义用户的位置。

标签: node.js mongodb mongoose


【解决方案1】:

已通过删除连接 URI 中的用户名和密码解决此问题

不要以这种方式建立猫鼬连接,

const session    = require('express-session');
const mongoose   = require('mongoose');
const mongoStore = require('connect-mongo')(session);

// Local connection
let mongoConnectionLocal = { 
    'url':`mongodb://${process.env.MongoDBLocalUser}:${process.env.MongoDBLocalPassword}@127.0.0.1:27017/my-database`
};    

mongoose.connect(mongoConnectionLocal.url, {auth:{authdb:"admin"}}, err => { if(err) { console.log(err); }});

创建一个选项并在那里设置数据库用户名和密码,

var options = {
  auth: {authdb: 'admin'},
  user: process.env.MongoDBLocalUser,
  pass: process.env.MongoDBLocalPassword,
}

let mongoConnectionLocal = { 
    'url': `mongodb://127.0.0.1:27017/my-database`
}; 

mongoose.connect(mongoConnectionOnline.url, options, err => { if(err) { console.log(err); }}); 

而且它有效。

注意:有人在评论中说我使用了错误的凭据,但我对新旧版本的 mongoose 使用了相同的凭据,并且两者都有效。

其他人也遇到了这个问题。见:MongoDB Auth Fails to find username on Bitnami MEAN Stack Image

[参考]https://github.com/Automattic/mongoose/issues/4891

【讨论】:

    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 2021-10-26
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多