我有一个数据库包装类,建立一个连接到一些MongoDB实例:
async connect(connectionString: string): Promise<void> {
this.client = await MongoClient.connect(connectionString)
this.db = this.client.db()
}
这给了我一个警告:
(node:4833) DeprecationWarning:当前URL字符串解析器已弃用,并将在未来版本中删除。要使用新的解析器,将选项{useNewUrlParser: true}传递给MongoClient.connect。
connect()方法接受一个MongoClientOptions实例作为第二个参数。但它没有useNewUrlParser属性。我还尝试在连接字符串中设置这些属性,就像这样:mongodb://127.0.0.1/my-db?useNewUrlParser=true,但它对那些警告没有影响。
那么我怎么能设置useneurlparser删除这些警告?这对我来说很重要,因为脚本应该以cron的方式运行,而这些警告会导致垃圾邮件。
我使用3.1.0-beta4版本的mongodb驱动程序,并在3.0.18中使用相应的@types/mongodb包。它们都是npm install可用的最新版本。
解决方案
使用旧版本的mongodb驱动程序:
"mongodb": "~3.0.8",
"@types/mongodb": "~3.0.18"
我使用mlab.com作为MongoDB数据库。我将连接字符串分离到一个名为config的不同文件夹,并在文件keys.js中保存连接字符串,这是:
模块导出 = {
mongoURI:“mongodb://username:password@ds147267.mlab.com:47267/projectname”
};
服务器代码是
const express = require("express");
const mongoose = require("mongoose");
const app = express();
// Database configuration
const db = require("./config/keys").mongoURI;
// Connect to MongoDB
mongoose
.connect(
db,
{ useNewUrlParser: true } // Need this for API support
)
.then(() => console.log("MongoDB connected"))
.catch(err => console.log(err));
app.get("/", (req, res) => res.send("hello!!"));
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Server running on port ${port}`)); // Tilde, not inverted comma
你需要像上面那样在连接字符串后面写{useNewUrlParser: true}。
简单地说,你需要做到:
猫鼬。connect(connectionString,{useNewUrlParser: true}
/ /或
MongoClient。connect(connectionString,{useNewUrlParser: true}
更新为ECMAScript 8 / await
MongoDB公司提供的错误的ECMAScript 8演示代码也会产生此警告。
MongoDB提供了如下建议,不正确
要使用新的解析器,将选项{useNewUrlParser: true}传递给MongoClient.connect。
这样做将导致以下错误:
executeOperation的最终参数必须是一个回调
相反,这个选项必须提供给新的MongoClient:
请看下面的代码:
const DATABASE_NAME = 'mydatabase',
URL = `mongodb://localhost:27017/${DATABASE_NAME}`
module.exports = async function() {
const client = new MongoClient(URL, {useNewUrlParser: true})
var db = null
try {
// Note this breaks.
// await client.connect({useNewUrlParser: true})
await client.connect()
db = client.db(DATABASE_NAME)
} catch (err) {
console.log(err.stack)
}
return db
}