【问题标题】:Mongoose connect throwing a warning猫鼬连接抛出警告
【发布时间】:2017-11-09 09:44:33
【问题描述】:

我正在编写一个连接 mongodb 的应用程序,并且像下面这样连接到服务器时收到如下警告:

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

我的代码如下所示

import mongoose from 'mongoose';
import config from './config';
mongoose.connect(config.db.uri);

在 config.js

const config = {
    name: 'API',
    version: '0.0.1',
    env: process.env.NODE_ENV || 'development',
    port: process.env.PORT || 3000,
    base_url: process.env.BASE_URL || 'http://localhost:3000',
    db: {
        uri: 'mongodb://admin:harry123@127.0.0.1:27017/ai?authSource=admin',
    },
}

export default config;

我正在使用 Node v8.0.0 和 mongoose 4.10.5

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    这是一个无害的警告和一个已知的猫鼬issue。有关详细信息,请参阅 mongoose 线程,但从 mongoose 4.10.5 开始,没有已知的解决方法,它应该不会影响您的应用程序的功能。

    【讨论】:

    • 松了一口气:D 谢谢
    【解决方案2】:

    警告是由于 MongoDB 驱动程序弃用了 mongoose 的默认连接逻辑使用的 API。从 mongoose 4.11.1 开始,您可以通过设置 useMongoClient 选项来选择使用 mongo 客户端,例如

    mongoose.connect(config.db.uri, { useMongoClient: true, /* other options */ })
    

    请注意,使用 Mongo 本地客户端可能会产生不良影响,因此请务必彻底测试所有内容
    查看更多详情here

    【讨论】:

    • 设置此选项导致的问题比它为很多人解决的问题要多。
    • 确实,4.11.0目前不稳定
    • 使用 { useMongoClient: true, /* other options */ } 时同样的问题
    • 4.11.1 中修复的问题
    • 4.11.2 也已修复
    【解决方案3】:
    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.
    

    是的,这是一个无害的警告,也是一个已知的 mongoose 问题。正如@所说 富国

    因此,您可以通过更新到高于 4.11.1 的最新版本的 mongoose 来解决此问题。

    升级版本后,如果您使用了连接选项,可能会出现此警告。

    he server/replset/mongos options are deprecated, all their options are supported at the top level of the options object [poolSize,ssl,sslValidate,sslCA,sslCert,sslKey,sslPass,sslCRL,autoReconnect,noDelay,keepAlive,connectTimeoutMS,family,socketTimeoutMS,reconnectTries,reconnectInterval,ha,haInterval,replicaSet,secondaryAcceptableLatencyMS,acceptableLatencyMS,connectWithNoPrimary,authSource,w,wtimeout,j,forceServerObjectId,serializeFunctions,ignoreUndefined,raw,bufferMaxEntries,readPreference,pkFactory,promiseLibrary,readConcern,maxStalenessSeconds,loggerLevel,logger,promoteValues,promoteBuffers,promoteLongs,domainsEnabled,keepAliveInitialDelay,checkServerIdentity,validateOptions,appname,auth]
    

    根据错误信息;

    the server/replset/mongos options are deprecated, all their options are supported at the top level of the options object
    

    所以,解决问题的方法是简单地将设置选项从服务器、replset、socketOptions、mongos 和任何其他层次结构选项移到对象的顶层。

    Solution with examples

    【讨论】:

      【解决方案4】:

      我只是通过使用 MongoClient.connect 而不是 mongoose.connect 解决了这个问题

      const MongoClient = require('mongodb').MongoClient 
      
      MongoClient.connect(config.uri, (err) => {
          if (err) {
              console.log('Could NOT connect to database: ', err);
          } else {
              console.log('Connected to database: ' + config.db);
          }
      });
      

      【讨论】:

        猜你喜欢
        • 2020-06-10
        • 2021-03-05
        • 1970-01-01
        • 1970-01-01
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-30
        相关资源
        最近更新 更多