Mongoose: 如果用户提供URI以避免使用Db.prototype.authenticate,请使用MongoClient.connect()而不是authenticate()

创建于 2017-05-28  ·  34评论  ·  资料来源: Automattic/mongoose

我正在使用类似的连接方法:

var Mongoose = require('mongoose');
connectionUrl = mongodb://some_login:some_pwd<strong i="6">@some_host</strong>:27017/some_db?authSource=admin
Mongoose.connect(connectionUrl); 

...如文档中所示,但是在NodeJS控制台上收到以下警告

Db.prototype.authenticate method will no longer be available 
in the next major release 3.x as MongoDB 3.6 will only allow auth 
against users in the admin db and will no longer allow multiple credentials on a socket. 
Please authenticate using MongoClient.connect with auth credentials.

Connection with database succeeded.

(如果忽略?authSource=admin则会导致身份验证失败)

这个阶段是否正常(我们是否需要等待下一个猫鼬发布?),或者从现在开始我应该改变什么?

版本:

节点:7.10.0
猫鼬:4.10.3
MongoDB的:3.4

谢谢。

confirmed-bug underlying library issue

最有用的评论

请不要只评论+1我们已经对此做出了明确的回应,指出它不是一个严重的错误,将此问题标记为confirmed-bug ,并且在猫鼬4.11之前还可以。 这只是一个警告消息,我什至发布了一种方法,如果您想将其静音,则可以使用mongodb logger来隐藏该消息。 我并不是故意要这样,但是+1消息只会泛滥我们的收件箱,当阅读该主题表明问题已解决时,这尤其令人讨厌

所有34条评论

+1

+1

+1
Mac OS X 10.12.5
节点:v7.10.0
猫鼬:4.10.3
MongoDB v3.4.4

+1

yup看起来只有在您实际触摸db进行一些操作(例如写操作)后才会发生:

我在管理数据库中创建了一个名为gh_5304 (使用相同的密码),并授予了该用户dbAdminAnyDatabase特权,然后在gh-5304的连接字符串中对该用户进行了身份验证表,将admin表指定为authSource:

const mongoose = require('mongoose');
const co = require('co');
mongoose.Promise = global.Promise;
const GITHUB_ISSUE = `gh-5304`;


exec()
  .then(() => {
    console.log('successfully ran program');
    process.exit(0);
  })
  .catch(error => {
    console.error(`Error: ${ error }\n${ error.stack }`);
  });


function exec() {
  return co(function*() {
    const db = mongoose.connect(`mongodb://gh_5304:gh_5304<strong i="11">@localhost</strong>:27017/${ GITHUB_ISSUE }?authSource=admin`);

    const schema = new mongoose.Schema({ name: String });

    const Model = db.model('Model', schema);

    const doc = yield Model.create({ name: 'Test' });
  });
}

日志输出:

Db.prototype.authenticate method will no longer be available in the next major release 3.x
as MongoDB 3.6 will only allow auth against users in the admin db and will no longer allow
multiple credentials on a socket. Please authenticate using MongoClient.connect with auth c
redentials.
successfully ran program

我将其标记为“错误”,尽管我不确定我将其描述为什么。 绝对是一个警告,应该引起注意...

authSource问题是预期的atm行为,如果要连接到some_db并且未在some_db数据库中定义用户,则需要指定authSource

回复:警告,这是猫鼬必须认真解决的问题,因为那是猫鼬身份验证当前唯一的工作方式。 即使您在MongoClient.connect()中指定凭据,猫鼬仍会在后台调用authenticate() 。 现在的计划是如果仅提供URI,则使4.11使用MongoClient.connect() ,或者如果使用主机,用户等,则退回到mongoose的内部连接逻辑。

直到4.11,我才不用担心这个警告。 据我所知,MongoDB 3.6和MongoDB驱动程序3.0不太可能在今年晚些时候发布,而这些更改将不需要任何最终用户更改。

感谢@varunjayaraman @ vkarpov15您的详细答案;)

有人知道禁用/隐藏此消息的方法吗? 当我生成一个进程时,我一直看到它出现了,它让我感到不安! 😅

我有同样的问题。

我也有同样的问题。 我不知道我该不该用猫鼬。

+1

同样的问题在这里

+1

+1
猫鼬:4.10.3
MongoDB v3.4

如果要在4.11之前关闭mongodb驱动程序的警告,可以尝试使用此处的步骤,并使用mongoose的基础客户端设置记录器:

http://mongodb.github.io/node-mongodb-native/2.2/reference/management/logging/

否则,您会没事的,该问题应在4.11

+1

const mongoose = require('mongoose');
var db = mongoose.connect(“ mongodb:// saiganesh:[email protected]:61121 / tester”);

var Scheme = mongoose.Schema({
标题:字符串,
作者:字符串,
正文:字符串,
评论:[{正文:字符串,日期:日期}]​​,
日期:{类型:日期,默认值:Date.now},
隐藏:布尔值,
中继:{
票数:
最爱:数字
}
});
module.exports = db.model('mongodb',Scheme);

var BlogPost = require(“ ./ models / mongodb.js”);

//创建新模型
var post = new BlogPost({标题:“我的第一条帖子”,作者:“ saiganesh”,
正文:“我们希望使文档过时”});

post.save(function(err){
如果(错误){
返回错误;
}
其他{
console.log(“发布已保存”);
}
});

错误:

node .index.js(node:2604)弃用警告:猫鼬:mpromise(猫鼬的de
故障承诺库),请插入您自己的承诺库: http :
Db.prototype.authenticate方法将在下一个主要发行版3.x中不再可用,因为MongoDB 3.6仅允许对管理员中的用户进行身份验证
db并且将不再允许在套接字上使用多个凭据。 请使用带有身份验证凭据的MongoClient.connect进行身份验证。

events.js:160
投掷者 //未处理的“错误”事件
^
MongoError:身份验证失败。
在Function.MongoError.create(C:UserssaiganeshDesktopsocket.io-masterexampleschatmongoosedbnode_modulesmongodb-coreliberror.js:31:11)
在C:UserssaiganeshDesktopsocket.io-masterexampleschatmongoosedbnode_modulesmongodb-corelibconnectionpool.js:497:72
在authenticateStragglers(C:UserssaiganeshDesktopsocket.io-masterexampleschatmongoosedbnode_modulesmongodb-corelibconnectionpool.js:443:
16)
在Connection.messageHandler(C:UserssaiganeshDesktopsocket.io-masterexampleschatmongoosedbnode_modulesmongodb-corelibconnectionpool.js:4
77:5)
在套接字。(C:UserssaiganeshDesktopsocket.io-masterexampleschatmongoosedbnode_modulesmongodb-corelibconnectionconnection.js:32
1:22)
在emitOne(events.js:96:13)
在Socket.emit(events.js:188:7)
在可读AddChunk(_stream_visible.js:176:18)
在Socket.Readable.push(_stream_visible.js:134:10)
在TCP.onread(net.js:548:20)

我应该使用哪个MongoDB和Mongoose版本来避免此错误?

这是虫子吧?

我遇到同样的问题。 MongoDB Shell版本v3.4.2
程序包json中的依赖项:“ mongodb”:“ ^ 2.2.28”,“ mongoose”:“ ^ 4.10.4”

“猫鼬”:“〜4.10.2”,正常工作!

好的,现在我已经删除了node_module文件夹,并将package.json更改为使用固定的旧版本“ mongoose”:“ 4.10.2”。 安装npm后,警告消息消失了:

├─┬ [email protected] │ └── [email protected] └─┬ [email protected] └─┬ [email protected] └── [email protected]
恐怕这不是一个好方法。 最新的mongoose和mongo软件之间应该兼容

是的,我正在等待错误修复,也许是下一版本

请不要只评论+1我们已经对此做出了明确的回应,指出它不是一个严重的错误,将此问题标记为confirmed-bug ,并且在猫鼬4.11之前还可以。 这只是一个警告消息,我什至发布了一种方法,如果您想将其静音,则可以使用mongodb logger来隐藏该消息。 我并不是故意要这样,但是+1消息只会泛滥我们的收件箱,当阅读该主题表明问题已解决时,这尤其令人讨厌

至于您的问题@msaiganesh ,这

+2(对我和我的同事而言)

“猫鼬”:“ ^ 4.10.4”

我也收到此错误-我认为这只是警告消息,而不是错误,并且不会阻止我继续吗?

Db.prototype.authenticate方法将在下一个主要版本3.x中不再可用,因为MongoDB 3.6将仅允许对admin数据库中的用户进行身份验证,并且将不再允许在套接字上使用多个凭据。 请使用带有身份验证凭据的MongoClient.connect进行身份验证。

我正试图用猫鼬连接到mlab数据库。 我曾尝试安装旧版本的猫鼬。

在MEAN应用上运行npm start时,我一直收到此错误。 我无法启动该应用。 有人可以帮忙吗?

在发送询问已回答的问题并且无意间向订阅此问题更新的所有人发送电子邮件之前,请完整阅读该问题。

我不知道你如何解决@JonathanBristow

v read these comments in this page but I still can t解决了这个问题! 你可以检查我的代码吗?

这是我的连接代码:

mongoose.Promise = require('bluebird');
mongoose.connect(“ mongodb://@ cluster0-shard-00-00-xlnqd.mongodb。 网址:27017 ,群集0-碎片-00-01-xlnqd.mongodb。 网址:27017 ,cluster0-shard-00-02-xlnqd.mongodb。 净额:27017 /?ssl = true&replicaSet = Cluster0-shard-0&authSource = admin“,function(err){
如果(错误){
console.log(err);
}其他{
console.log('已成功连接到数据库。');
}
});

我得到了这个警告:
“ Db.prototype.authenticate方法在下一个将不再可用
主要版本3.x,因为MongoDB 3.6仅允许针对
admin db,并且将不再允许在套接字上使用多个凭据。 请
使用具有身份验证凭据的MongoClient.connect进行身份验证。”

@thinkdiff ...这是warning ,而不是error 。 警告通常表示不会破坏代码的内容。 用英语:没有结构上的错误,不用担心。

我暂时锁定此问题,以防止继续发送垃圾邮件。 将有一个选项可以关闭4.11中的此警告,除非有任何意外的延迟,否则将在本周发布。 无法在4.10.x中绕过此警告。 感谢您的耐心等待。

此页面是否有帮助?
0 / 5 - 0 等级