服务器发现和监视引擎已弃用


104

我在我的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回答时,猫鼬存在问题,他们在更高版本中修复了该错误。因此,您可以通过更新猫鼬版本来解决问题。

Answers:


184

更新资料

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

就我而言,尽管选项应该为false,但我不会在副本集或分片群集中使用Mongoose。但是如果为假,它会抱怨设置应该为真。一旦为真,它仍然不起作用,可能是因为我的数据库未在副本集或分片群集上运行。

我已降级为5.6.13,并且我的项目恢复正常。因此,我目前唯一看到的选择是将其降级,并等待更新更新。


我以为是相同的(降级版本),我正在使用mlab集群,所以也许是警告不消失的原因?
iLiA

2
有在最新的猫鼬的错误5.7.7,如果你使用createConnection()的不是connect()一样mongoose.createConnection(conString, { useUnifiedTopology: true })useUnifiedTopology不会被考虑,您仍然会收到警告。mongoose.set('useUnifiedTopology', true)我的事件仍然得到警告。
Louis Grellet

2
警告仍然存在降级后5.6.13
O'Dane Brissett

1
我使用本机MongoDB驱动程序遇到了该错误!
阿希拉

这里有所有不推荐使用的选项:mongoosejs.com/docs/deprecations.html
Murtaza Ahmad

28

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

{useUnifiedTopology:true}

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

13
如果您阅读了我的问题,我提到的是我useUnifiedTopology: true在配置中添加的内容,它仍然向我显示警告
iLiA

5
我遇到了这个问题,我也添加了,useUnifiedTopology: true但控制台上仍然出现相同的消息。
RSA

7
对于仍然收到消息的任何人,请尝试mongoose.set('useUnifiedTopology', true)在mongoose.connect之前致电。
dev4life

是的,这是正确的答案。您只需将“ useUnifiedTopology:true,useNewUrlParser:true”放到一对{}中。我虽然没有使用“ useCreateIndex:true”,但是它给了我一些主意。dev4life的方法也有效。
侯侯

猫鼬.connect(“ db conn url”,{useUnifiedTopology:true,useNewUrlParser:true,}).then(()=> console.log('MongoDB Connected!')).catch(err => {err => console .LOG(ERR)}),这是对我工作
SANKET Sonavane

9

这解决了我的问题。

 const url = 'mongodb://localhost:27017';

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

感谢您的回答,但这是猫鼬的问题,我不使用mongoclient
iLiA

4
@iLiA不客气。是的我知道。但是这个答案可能会有所帮助的人,因为我发现你的问题正是由标题题目,而不是由内容(和你的问题的内容非常接近约MongoClient一般信息)
ЮрийСветлов

3

您可以尝试异步等待

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}
Yousuf

3

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

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

2
mongoose.connect('mongodb://localhost:27017/Tododb', { useNewUrlParser: true, useUnifiedTopology: true });

将删除以下错误:-

(节点:7481)DeprecationWarning:不建议使用当前的URL字符串解析器,并将在以后的版本中将其删除。要使用新的解析器,请将选项{useNewUrlParser:true}传递给MongoClient.connect。

(节点:7481)DeprecationWarning:不建议使用当前的“服务器发现和监视”引擎,并将在以后的版本中将其删除。要使用新的“服务器发现和监视”引擎,请将选项{useUnifiedTopology:true}传递给MongoClient构造函数。


3
还请确保添加useUnifiedTopology: true到使用mongoDB的所有依赖项,就我而言,我还wiston-mongodb必须在选项中添加它 winston.add(new winston.transports.MongoDB({ db: config.get('db'), options: { useUnifiedTopology: true } }));
Gael Musikingala

@GaelMusikingala这是我的问题。感谢您指出这一点
akmalhakimi1991 '02

@GaelMusikingala,感谢您的救命。❤️👏
Mr.spShuvo

2

添加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:猫鼬:findOneAndUpdate()findOneAndDelete()没有useFindAndModify选项设置为false已被弃用。请参阅:https : //mongoosejs.com/docs/deprecations.html#-findandmodify-

希望能帮助到你。


1
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);
});

1

如果您的代码出于某种原因包含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,
    }
})

如果您的案件看起来像我的,那肯定会解决您的问题。问候


0

我也面临着同样的问题:

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

    brew services start mongodb-community@4.2
    

    我得到了输出:

    Successfully started `mongodb-community`
    


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

  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));
    

解决了我的问题!


0
   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);
    });  

}});


0

设置猫鼬连接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();

0

这对我有用

对于使用的人,请MongoClient尝试以下操作:

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

对于猫鼬:

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

删除其他连接


1
我承认我没有使用mongoClient
iLiA

0

我想添加到该线程中,它可能也与其他依赖项有关。

例如,我没有为NodeJS,MongoDB或Mongoose更新或设置任何问题,但是-connect-mongodb-session已更新并开始处理相同的错误。在这种情况下,解决方案是简单地将version的connect-mongodb-session版本回滚2.3.02.2.0

在此处输入图片说明


0

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

mongoose.connect("mongodb://localhost:27017/${yourDB}", {
    useNewUrlParser: true,
    useUnifiedTopology: true

}, function (err) {
    if (err) {
        console.log(err)
    } else {
        console.log("Database connection successful")
    }
});

0

用这条线,这对我有用

mongoose.set('useUnifiedTopology', true);

1
如果可能,请尝试提供其他说明,而不只是提供代码。这样的答案往往会更有用,因为它们可以帮助社区成员,尤其是新开发人员更好地了解解决方案的原因,并可以帮助防止需要解决后续问题。
Rajan

0

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

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

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

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

0
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));
    }
});

如果可能,请尝试提供其他说明,而不只是提供代码。这样的答案往往会更有用,因为它们可以帮助社区成员,尤其是新开发人员更好地了解解决方案的原因,并可以帮助防止需要解决后续问题。
Rajan

0

很简单,删除您已使用的代码,然后使用以下代码:

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

0

如果您使用打字稿,请将配置添加到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,
};

0

运行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.')
})


0

这将起作用:

// 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));

0
const url = 'mongodb://localhost:27017';
const client = new MongoClient(url);

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

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


0

mongo的工作示例代码,参考链接

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();
  });
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.