【问题标题】:Why am I getting this deprecated warning?! MongoDB为什么我会收到这个已弃用的警告?! MongoDB
【发布时间】:2021-07-16 04:48:41
【问题描述】:

我正在使用 NodeJS 中的 MongoDB,

    const { MongoClient, ObjectId } = require("mongodb");

const MONGO_URI = `mongodb://xxx:xxx@xxx/?authSource=xxx`; // prettier-ignore

class MongoLib {

  constructor() {
    this.client = new MongoClient(MONGO_URI, {
      useNewUrlParser: true,
    });
    this.dbName = DB_NAME;
  }

  connect() {
    return new Promise((resolve, reject) => {
      this.client.connect(error => {
        if (error) {
          reject(error);
        }
        resolve(this.client.db(this.dbName));
      });
    });
  }
  async getUser(collection, username) {
    return this.connect().then(db => {
      return db
        .collection(collection)
        .find({ username })
        .toArray();
    });
  }
}

let c = new MongoLib();

c.getUser("users", "pepito").then(result => console.log(result));
c.getUser("users", "pepito").then(result => console.log(result));

当执行最后一个 c.getUser 语句时(也就是说,当我进行 SECOND 连接时)Mongodb 输出此警告:

the options [servers] is not supported
the options [caseTranslate] is not supported
the options [username] is not supported
the server/replset/mongos/db 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,keepAliveInitialDelay,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,checkServerIdentity,validateOptions,appname,auth,user,password,authMechanism,compression,fsync,readPreferenceTags,numberOfRetries,auto_reconnect,minSize,monitorCommands,retryWrites,useNewUrlParser]

但我没有使用任何已弃用的选项。有什么想法吗?


编辑

在与 cmets 中的 molank 进行了一些讨论之后,看起来从同一服务器打开多个连接不是一个好习惯,所以也许这就是警告想要表达的意思(我认为很糟糕)。所以如果你有同样的问题,保存连接而不是mongo客户端。

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    转自https://jira.mongodb.org/browse/NODE-1868:

    弃用消息可能是因为client.connect 被多次调用。总体而言,目前多次调用client.connect(截至驱动程序v3.1.13)具有未定义的行为,不建议这样做。需要注意的是,一旦从 connect 返回的 promise 解析完成,客户端将保持连接,直到您调用 client.close:

    const client = new MongoClient(...);
    
    client.connect().then(() => {
      // client is now connected.
      return client.db('foo').collection('bar').insertOne({
    }).then(() => {
      // client is still connected.
    
      return client.close();
    }).then(() => {
      // client is no longer connected. attempting to use it will result in undefined behavior.
    });
    

    默认情况下,客户端维护与其连接的每个服务器的多个连接,并可用于多个同时操作*。您应该可以很好地运行一次client.connect,然后在客户端对象上运行您的操作

    * 请注意,客户端不是线程安全或分叉安全的,因此它不能在分叉之间共享,并且与节点的 cluster 或 worker_threads 模块不兼容。

    【讨论】:

      【解决方案2】:

      函数 .connect() 接受 3 个参数 并被定义为 MongoClient.connect(url[, options], callback)。所以你需要先提供一个 URL,然后是选项,然后你才给它回调。这是文档中的一个示例

      MongoClient.connect("mongodb://localhost:27017/integration_tests", { native_parser: true }, function (err, db) {
          assert.equal(null, err);
      
          db.collection('mongoclient_test').update({ a: 1 }, { b: 1 }, { upsert: true }, function (err, result) {
              assert.equal(null, err);
              assert.equal(1, result);
      
              db.close();
          });
      });
      

      另一种方法是使用 .open,因为您已经创建了 MongoClient。它只需要一个回调,但是您从您创建的mongoClient (this.client) 调用它。你可以这样使用它

      this.client.open(function(err, mongoclient) {
          // Do stuff
      });
      

      注意

      请务必查看MongoClient docs,您会发现很多很好的示例,可以更好地指导您。

      【讨论】:

      • 这不能回答我的问题。 open() 也被弃用了。我正在按照文档中的说明进行连接,但是当我进行第二次连接时会出现。
      • 谁说open 已弃用?因为这在文档中没有提到。你也没有说你在你的问题中连接了两次
      • 这是我的错,open() 在猫鼬中已被弃用,但我没有使用它,抱歉造成混乱。是的,我忘了说这发生在我的第二次连接中,我要修复它。抱歉发表评论
      • 我现在没有明确告诉它
      • Eeemmm 是的,但是您可以创建一个新的 MongoClient(uri, options) 实例(我们称之为 db),然后调用 db.connect(callback)。文档:mongodb.github.io/node-mongodb-native/3.1/api/MongoClient.html。实际上,如果我尝试使用 open(),它会输出一个错误,告诉 open() 不是函数
      【解决方案3】:

      poolSize 已弃用,请使用 maxPoolSize。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-16
        • 1970-01-01
        相关资源
        最近更新 更多