不推荐使用服务器发现和监视引擎

我在 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)
})

但在控制台上,它仍然给我一个警告:

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

有什么问题吗?我以前没有使用 useUnifiedTopology,但是现在它出现在控制台中。我把它添加到配置中,但它仍然给我这个警告,为什么?我甚至不使用 MongoClient

剪辑

Felipe Plets 回答说,Mongoose 有一个问题,他们在后来的版本中修复了这个 bug。所以你可以通过更新猫鼬版本来解决问题。

189320 次浏览

更新

Mongoose 5.7.1发布了,似乎解决了这个问题,所以按照预期设置 useUnifiedTopology选项就可以了。

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

原始答案

我也面临着同样的问题,所以决定深入研究猫鼬代码: 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,我的项目也恢复正常。因此,我现在看到的唯一选择是降级,等待修复程序更新到新版本。

在 mongoDB 中,它们不支持当前的服务器和引擎监视包,因此需要使用新的服务器和引擎监视包。所以你就用

{ useUnifiedTopology: true }

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

这招对我很管用

对于那些使用 MongoClient的人来说,试试这个:

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

对猫鼬来说:

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

删除其他连接选项

您可以尝试异步等待

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

我也面临着同样的问题:

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

    brew services start mongodb-community@4.2
    

    我得到了结果:

    Successfully started `mongodb-community`
    

Instructions for installing mongodb at
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/ or https://www.youtube.com/watch?v=IGIcrMTtjoU

  1. My configuration was as follows:

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

Which solved my problem!

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

}});

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

这解决了我的问题。

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


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

将删除以下错误:-

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

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

添加 UseUnifiedTopology 统一拓扑选项并将其设置为 没错

设置其他3个配置的 猫鼬,连接选项,将处理其他剩余的 警告

这个配置适合我!

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

这将解决4 警告

  1. 不推荐使用当前 URL 字符串解析器,将在以后的版本中删除。若要使用新的解析器,请将选项{ useNewUrlParser: true }传递给 MongoClient.connect。
  2. 当前的服务器发现和监视引擎已被弃用,将在以后的版本中删除。若要使用新的服务器发现和监视引擎,请传递选项{ UseUnifiedTopology: true }到 MongoClient 构造函数。
  3. 不推荐使用 Collection.ensureIndex。改为使用 createIndex。
  4. 不推荐使用没有将 useFindAndModify选项设置为 false 的 findOneAndUpdate()findOneAndDelete()

希望能有帮助。

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

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

enter image description here

每次我都会犯同样的错误,这对我很有效

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


}, function (err) {
if (err) {
console.log(err)
} else {
console.log("Database connection successful")
}
});
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);
});

用这句台词,这对我很管用

mongoose.set('useUnifiedTopology', true);

如果使用 MongoDB 服务器 然后在集群时钟中使用 connect 进行连接并找到 URL 之后, 网址大概是这样的

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

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

const client = new MongoClient(url,{useUnifiedTopology:true});
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));
}
});

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

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

如果您的代码由于某种原因包含 createConnection (在我的例子中,我使用的是 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,
}
})

如果你的案子和我的一样这肯定能解决你的问题。 问候

很简单,删除你使用的代码,然后使用下面的代码:

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

如果使用类型脚本,则向 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,
};

重要的是要运行您的 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.')
})

这将奏效:

// 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));
const url = 'mongodb://localhost:27017';
const client = new MongoClient(url);

剪掉上面的第二行,然后只要替换那条线

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

这对我来说很好用,不会再有错误了。

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

工作样本代码

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

以上的答案对于了解需要采取哪些措施来消除这些警告非常有帮助。但我没有找到“为什么”的答案。关于使用节点服务器连接 MongoDB 的警告的一个答案指向 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/

那些在使用带有 多网格存储器等扩展名的 Mongoose 时发出弃用警告的用户。

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

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

干杯!

嗯,最近我也遇到了同样的问题。我仔细研究了这个 猫鼬医生并找到了解决方案。

按如下方式更新您的 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

const mongoose = require('mongoose');
const DB = process.env.DATABASE;
mongoose.connect(DB, {
useNewUrlParser: true,
useCreateIndex: true,
useUnifiedTopology: true,
useFindAndModify: false
}).then(()=>{
console.log("connection successful");
}).catch((err) =>{
console.log("no connection");
});

如果使用 winston,则需要 { useUnifiedTopology: true }

例如:

winston.add(
new winston.transports.MongoDB({
db: 'mongodb://localhost/vidly',
level: 'error',
options: { useUnifiedTopology: true },
})
);