【问题标题】:Server Discovery And Monitoring engine is deprecated服务器发现和监控引擎已弃用
【发布时间】:2020-01-13 15:36:40
【问题描述】:

我在我的 Node.js 应用程序中使用 Mongoose,这是我的配置:

mongoose.connect(process.env.MONGO_URI, {
   useNewUrlParser: true,
   useUnifiedTopology: true,
   useCreateIndex: true,
   useFindAndModify: false
}).then(()=>{
    console.log(`connection to database established`)
}).catch(err=>{
    console.log(`db error ${err.message}`);
    process.exit(-1)
})

但在控制台中它仍然给我警告:

DeprecationWarning:当前的服务器发现和监控引擎已被弃用,并将在未来的版本中删除。要使用新的服务器发现和监控引擎,请将选项 { useUnifiedTopology: true } 传递给 MongoClient 构造函数。

有什么问题?我之前没有使用useUnifiedTopology,但现在它显示在控制台中。我将它添加到配置中,但它仍然给我这个警告,为什么?我什至不使用MongoClient

编辑

正如 Felipe Plets 回答的那样,Mongoose 存在问题,他们在以后的版本中修复了这个错误。所以你可以通过更新猫鼬版本来解决问题。

【问题讨论】:

    标签: javascript node.js typescript mongodb mongoose


    【解决方案1】:

    更新

    Mongoose 5.7.1 已发布,似乎解决了该问题,因此设置 useUnifiedTopology 选项按预期工作。

    mongoose.connect(mongoConnectionString, {useNewUrlParser: true, useUnifiedTopology: true});
    

    原答案

    我遇到了同样的问题并决定深入研究 Mongoose 代码:https://github.com/Automattic/mongoose/search?q=useUnifiedTopology&unscoped_q=useUnifiedTopology

    似乎是在 Mongoose 5.7 版中添加的一个选项,但还没有很好的文档记录。我什至在图书馆历史中都找不到它https://github.com/Automattic/mongoose/blob/master/History.md

    根据代码中的注释:

    • @param {Boolean} [options.useUnifiedTopology=false] 默认为 False。设置为 true 以选择加入 MongoDB 驱动程序的副本集和分片集群监控引擎。

    项目GitHub上也有关于这个错误的问题:https://github.com/Automattic/mongoose/issues/8156

    在我的情况下,我不在副本集或分片集群中使用 Mongoose,尽管该选项应该为 false。但如果为假,则抱怨该设置应该为真。一旦为真,它仍然无法工作,可能是因为我的数据库没有在副本集或分片集群上运行。

    我已降级到 5.6.13,我的项目又可以正常工作了。所以我现在看到的唯一选择是降级它并等待修复更新为新版本。

    【讨论】:

    • 我也这么认为(降级版本),我使用的是 mlab 集群,所以可能是警告没有消失的原因?
    • 如果您使用createConnection() 而不是connect(),则最新的猫鼬5.7.7 中存在一个错误,例如mongoose.createConnection(conString, { useUnifiedTopology: true })useUnifiedTopology 不会被考虑在内,您仍然会收到警告。 mongoose.set('useUnifiedTopology', true) 的事件我仍然收到警告。
    • 降级到 5.6.13 后警告仍然存在
    • 我在使用本机 MongoDB 驱动程序时遇到了这个错误!
    • 这里有所有已弃用的选项:mongoosejs.com/docs/deprecations.html
    【解决方案2】:

    在 mongoDB 中,他们弃用了当前的服务器和引擎监控包,因此您需要使用新的服务器和引擎监控包。所以你只需使用

    { useUnifiedTopology:true }

    mongoose.connect("paste db link", {useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true });
    

    【讨论】:

    • 如果您阅读了我的问题,我提到我在配置中添加了useUnifiedTopology: true,但它仍然向我显示警告
    • 我遇到了这个问题,我还添加了useUnifiedTopology: true,但控制台上仍然出现相同的消息。
    • 对于仍然收到消息的任何人,请尝试在 mongoose.connect 之前致电 mongoose.set('useUnifiedTopology', true)
    • 是的,这是正确的答案。您只需将“useUnifiedTopology: true, useNewUrlParser: true”放在一对 {} 中。虽然我没有使用“useCreateIndex:true”,但它给了我一些想法。 dev4life 的方式也行得通。
    • mongoose .connect("db conn url", { useUnifiedTopology: true, useNewUrlParser: true, }) .then(() => console.log('MongoDB Connected!')) .catch( err => { err => console.log(err) }) 这对我有用
    【解决方案3】:

    这解决了我的问题。

     const url = 'mongodb://localhost:27017';
    
     const client = new MongoClient(url, {useUnifiedTopology: true});
    

    【讨论】:

    • 感谢您的回答,但这是猫鼬问题,我没有使用 mongoclient
    • @iLiA 欢迎您。是的,我知道。但是这个答案可能对某人有帮助,因为我完全通过标题主题而不是内容找到了您的问题(并且您的问题内容非常接近有关 MongoClient 的一般信息)
    • 感谢您的回答!正如您所提到的,由于在使用 mongoclient 而不是 mongoose 时提到的错误,我来到了这里,有帮助!
    【解决方案4】:
    mongoose.connect('mongodb://localhost:27017/Tododb', { useNewUrlParser: true, useUnifiedTopology: true });
    

    将删除以下错误:-

    (node:7481) DeprecationWarning:当前 URL 字符串解析器已被弃用,并将在未来版本中删除。要使用新的解析器,请将选项 { useNewUrlParser: true } 传递给 MongoClient.connect。

    (node:7481) DeprecationWarning:当前的服务器发现和监控引擎已被弃用,并将在未来的版本中删除。要使用新的服务器发现和监控引擎,请将选项 { useUnifiedTopology: true } 传递给 MongoClient 构造函数。

    【讨论】:

    • 还要确保将 useUnifiedTopology: true 添加到所有使用 mongoDB 的依赖项中,在我的情况下,我使用的是 wiston-mongodb 我必须在选项中添加它以及 winston.add(new winston.transports.MongoDB({ db: config.get('db'), options: { useUnifiedTopology: true } }));
    • @GaelMusikingala 这是我的问题。感谢您指出这一点
    • @GaelMusikingala,感谢您救了我的命。 ❤️?
    【解决方案5】:

    你可以试试异步等待

    const connectDB = async () => {
        try {
            await mongoose.connect(<database url>, {
                useNewUrlParser: true,
                useCreateIndex: true,
                useUnifiedTopology: true,
                useFindAndModify: false
            });
            console.log("MongoDB Conected")
        } catch (err) {
            console.error(err.message);
            process.exit(1);
        }
    };

    【讨论】:

    • 使用 {useUnifiedTopology: true}
    【解决方案6】:

    嗯,最近我遇到了同样的问题。我通过了mongoose docs 并找到了解决方案。

    如下更新你的 mongodb 连接实例并分别设置useUnifiedTopology 如下 -

    mongoose.connect(process.env.MONGO_URI, {
       useNewUrlParser: true,
       useCreateIndex: true,
       useFindAndModify: false
    }).then(()=>{
        console.log(`connection to database established`)
    }).catch(err=>{
        console.log(`db error ${err.message}`);
        process.exit(-1)
    });
    
    mongoose.set('useUnifiedTopology', true);

    注意:我使用的是node@16.4.0mongoose@5.13.1

    【讨论】:

      【解决方案7】:

      添加 useUnifiedTopology 选项并将其设置为 true

      设置 mongoose.connect 选项的其他 3 个配置,它们将处理其他剩余的 DeprecationWarning

      这个配置对我有用!

      const url = 'mongodb://localhost:27017/db_name';
      mongoose.connect(
          url, 
          { 
              useNewUrlParser: true, 
              useUnifiedTopology: true,
              useCreateIndex: true,
              useFindAndModify: false
          }
      )
      

      这将解决 4 个DeprecationWarning

      1. 不推荐使用当前的 URL 字符串解析器,并将在未来的版本中删除。要使用新的解析器,请将选项 { useNewUrlParser: true } 传递给 MongoClient.connect。
      2. 当前的服务器发现和监控引擎已被弃用,并将在未来的版本中删除。要使用新的服务器发现和监控引擎,请传递选项 { useUnifiedTopology: true } 到 MongoClient 构造函数。
      3. Collection.ensureIndex 已弃用。请改用 createIndexes。
      4. DeprecationWarning: Mongoose: findOneAndUpdate()findOneAndDelete() 没有将 useFindAndModify 选项设置为 false 已被弃用。请参阅:https://mongoosejs.com/docs/deprecations.html#-findandmodify-

      希望对你有帮助。

      【讨论】:

        【解决方案8】:

        使用以下代码来避免该错误

        MongoClient.connect(connectionString, {useNewUrlParser: true, useUnifiedTopology: true});
        

        【讨论】:

          【解决方案9】:

          如果您的代码出于某种原因包含 createConnetion(在我的情况下,我使用的是 GridFsStorage), 尝试将以下内容添加到您的代码中:

              options: {
                  useUnifiedTopology: true,
              }
          

          就在文件之后,像这样:

              const storage = new GridFsStorage({
              url: mongodbUrl,
              file: (req, file) => {
                  return new Promise((resolve, reject) => {
                      crypto.randomBytes(16, (err, buf) => {
                          if (err) {
                              return reject(err);
                          }
                          const filename = buf.toString('hex') + path.extname(file.originalname);
                          const fileInfo = {
                              filename: filename,
                              bucketName: 'uploads'
                          };
                          resolve(fileInfo);
                      });
                  });
              },
              options: {
                  useUnifiedTopology: true,
              }
          })
          

          如果您的情况与我的情况相似,这肯定会解决您的问题。 问候

          【讨论】:

            【解决方案10】:

            这对我有用

            对于使用MongoClient 的人,试试这个:

            MongoClient.connect(connectionurl, 
              {useUnifiedTopology: true, useNewUrlParser: true},  callback() {
            

            对于猫鼬:

            mongoose.connect(connectionurl, 
                     {useUnifiedTopology: true, useNewUrlParser: true}).then(()=>{
            

            删除其他连接选项

            【讨论】:

            • 我承认我没有使用mongoClient
            【解决方案11】:
            const mongoose = require("mongoose");
            
            mongoose.connect('mongodb://localhost:27017/Edureka',{ useNewUrlParser: true, useUnifiedTopology: true }, (error)=> {
                const connectionStatus = !error ? 'Success': 'Error Connecting to database';
                console.log(connectionStatus);
            });
            

            【讨论】:

              【解决方案12】:

              这对我来说很好,没有更多错误。

              mongoose
              .connect(URL_of_mongodb, {
              useUnifiedTopology: true,
              useNewUrlParser: true,
              })
              .then(() => console.log('DB Connected!'))
              .catch(err => {
              console.log(`DB Connection Error: ${err}`);
              });
              

              【讨论】:

              【解决方案13】:

              mongo 的工作示例代码,reference link

              var MongoClient = require('mongodb').MongoClient;
              var url = "mongodb://localhost:27017/";
              MongoClient.connect(url,{ useUnifiedTopology: true }, function(err, db) {
                if (err) throw err;
                var dbo = db.db("mydb");
                dbo.createCollection("customers", function(err, res) {
                  if (err) throw err;
                  console.log("Collection created!");
                  db.close();
                });
              });
              

              【讨论】:

                【解决方案14】:

                那些在使用带有 multer-gridfs-storage 等扩展程序的 Mongoose 时收到弃用警告的人。

                由于 GridFS Storage 调用您的 Mongoose 构造函数,您可以在实例创建中传递建议的选项,以获得继承。

                new GridFsStorage({ options: { useUnifiedTopology: true }});
                

                干杯!

                【讨论】:

                  【解决方案15】:

                  以上答案对于了解需要做什么来消除警告非常有帮助。但我没有找到“为什么”的答案。 Warning on Connecting to MongoDB with a Node server 的答案之一指向https://github.com/mongodb/node-mongodb-native/releases/tag/v3.2.1。让我试着在这里总结一下。欲了解更多详情,您可以访问以上链接。

                  在 v3.1.0 版本中,2.x 驱动程序已被弃用并完全重写。重写引入了拓扑的新概念,取代了现有的拓扑概念,如 Mongos、ReplSet 和 Server 等,以获得更好的可维护性和可追溯性。可以通过传递标志 useUnifiedTopology 来启用此功能。警告是为了鼓励用户尽快尝试。

                  另一个有用的链接从 NodeJS 的角度讨论这个问题:https://mongodb.github.io/node-mongodb-native/3.3/reference/unified-topology/

                  【讨论】:

                    【解决方案16】:

                    我也遇到了同样的问题:

                    1. 我通过在终端上运行以下命令确保连接到 mongoDB:

                      brew services start mongodb-community@4.2
                      

                      我得到了输出:

                      Successfully started `mongodb-community`
                      


                    https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/ 安装 mongodb 的说明 或https://www.youtube.com/watch?v=IGIcrMTtjoU

                    1. 我的配置如下:

                      mongoose.connect(config.mongo_uri, {
                          useUnifiedTopology: true,
                          useNewUrlParser: true})
                          .then(() => console.log("Connected to Database"))
                          .catch(err => console.error("An error has occured", err));
                      

                    这解决了我的问题!

                    【讨论】:

                      【解决方案17】:
                         const mongo = require('mongodb').MongoClient;
                      
                         mongo.connect(process.env.DATABASE,{useUnifiedTopology: true, 
                         useNewUrlParser: true}, (err, db) => {
                            if(err) {
                          console.log('Database error: ' + err);
                         } else {
                          console.log('Successful database connection');
                            auth(app, db)
                            routes(app, db)
                      
                         app.listen(process.env.PORT || 3000, () => {
                            console.log("Listening on port " + process.env.PORT);
                          });  
                      

                      }});

                      【讨论】:

                        【解决方案18】:

                        设置猫鼬连接useUnifiedTopology: true选项

                          import mongoose from 'mongoose';
                        
                                const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
                                const database = 'DBName'; // REPLACE WITH YOUR DB NAME
                                class Database {
                                  constructor() {
                                    this._connect();
                                  }
                                  _connect() {
                                    mongoose.Promise = global.Promise;
                                    // * Local DB SERVER *
                                    mongoose
                                      .connect(`mongodb://${server}/${database}`, {
                                        useNewUrlParser: true,
                                        useCreateIndex: true,
                                        useUnifiedTopology: true
                                      })
                                      .then(
                                        () => console.log(`mongoose version: ${mongoose.version}`),
                                        console.log('Database connection successful'),
                                      )
                                      .catch(err => console.error('Database connection error', err));   
                                  }
                                }
                                module.exports = new Database();
                        

                        【讨论】:

                          【解决方案19】:

                          我想在此线程中添加它可能还与其他依赖项有关。

                          例如,我为 NodeJS、MongoDB 或 Mongoose 更新或设置的任何内容都不是问题 - 但是 - connect-mongodb-session 已更新并开始出现相同的错误。在这种情况下,解决方案是将connect-mongodb-session 的版本从2.3.0 版本简单地回滚到2.2.0

                          【讨论】:

                            【解决方案20】:

                            我每次都会弹出相同的错误,这对我有用

                            mongoose.connect("mongodb://localhost:27017/${yourDB}", {
                                useNewUrlParser: true,
                                useUnifiedTopology: true
                            
                            }, function (err) {
                                if (err) {
                                    console.log(err)
                                } else {
                                    console.log("Database connection successful")
                                }
                            });
                            

                            【讨论】:

                              【解决方案21】:

                              使用这条线,这对我有用

                              mongoose.set('useUnifiedTopology', true);
                              

                              【讨论】:

                              • 如果可能,请努力提供额外的解释,而不仅仅是代码。此类答案往往更有用,因为它们可以帮助社区成员,尤其是新开发人员更好地理解解决方案的推理,并有助于避免需要解决后续问题。
                              【解决方案22】:

                              如果您使用的是 MongoDB 服务器 然后在集群时钟中使用 connect 并找到 URL 后, URL 会是这样的

                              <mongodb+srv://Rohan:<password>@cluster0-3kcv6.mongodb.net/<dbname>?retryWrites=true&w=majority>
                              

                              在这种情况下,不要忘记将密码替换为您的数据库密码和数据库名称 然后使用

                              const client = new MongoClient(url,{useUnifiedTopology:true});
                              

                              【讨论】:

                                【解决方案23】:
                                mongoose.connect("DBURL", {useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true },(err)=>{
                                    if(!err){
                                         console.log('MongoDB connection sucess');
                                        }
                                    else{ 
                                        console.log('connection not established :' + JSON.stringify(err,undefined,2));
                                    }
                                });
                                

                                【讨论】:

                                • 如果可能,请努力提供额外的解释,而不仅仅是代码。此类答案往往更有用,因为它们可以帮助社区成员,尤其是新开发人员更好地理解解决方案的推理,并有助于避免需要解决后续问题。
                                【解决方案24】:

                                很简单,去掉你用过的代码,使用下面的代码:

                                const url = 'mongodb://localhost:27017';
                                var dbConn = mongodb.MongoClient.connect(url, {useUnifiedTopology: true});
                                

                                【讨论】:

                                  【解决方案25】:

                                  如果你使用 typescript 添加配置到 MongoOptions

                                  const MongoOptions: MongoClientOptions = {
                                    useNewUrlParser: true,
                                    useUnifiedTopology: true,
                                  };
                                  
                                        const client = await MongoClient.connect(url, MongoOptions);
                                  
                                  if you not used typescript  
                                  const MongoOptions= {
                                    useNewUrlParser: true,
                                    useUnifiedTopology: true,
                                  };
                                  

                                  【讨论】:

                                    【解决方案26】:

                                    这将起作用:

                                    // Connect to Mongo
                                    mongoose.set("useNewUrlParser", true);
                                    mongoose.set("useUnifiedTopology", true);
                                    
                                    mongoose
                                      .connect(db) // Connection String here
                                      .then(() => console.log("MongoDB Connected..."))
                                      .catch(() => console.log(err));
                                    

                                    【讨论】:

                                      【解决方案27】:
                                      const url = 'mongodb://localhost:27017';
                                      const client = new MongoClient(url);
                                      

                                      剪掉上面的第二行,然后替换那行

                                      const client = new MongoClient(url, { useUnifiedTopology: true });
                                      

                                      【讨论】:

                                        【解决方案28】:

                                        运行 mongod 命令并保持服务器运行非常重要。如果没有,您仍然会看到此错误。

                                        我附上我的代码:

                                        const mongodb = require('mongodb')
                                            const MongoClient = mongodb.MongoClient
                                        
                                            const connectionURL = 'mongodb://127.0.0.1:27017'
                                            const databaseName = 'task-manager'
                                        
                                            MongoClient.connect(connectionURL, {useNewUrlParser: true, useUnifiedTopology: true}, (error, client) => {
                                                if(error) {
                                                    return console.log('Error connecting to the server.')
                                                }
                                        
                                                console.log('Succesfully connected.')
                                            })
                                        

                                        【讨论】:

                                          猜你喜欢
                                          • 2020-02-22
                                          • 2020-05-12
                                          • 2020-04-26
                                          • 2022-01-04
                                          • 2020-08-25
                                          • 2018-10-28
                                          • 2011-07-05
                                          • 2018-05-08
                                          • 2021-06-12
                                          相关资源
                                          最近更新 更多