我有一个数据库包装类,建立一个连接到一些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"

正如我们所注意到的,驱动程序的3.1.0-beta4版本从目前的情况来看,“被释放到野外”有点早。该版本是正在进行的工作的一部分,以支持即将发布的MongoDB 4.0中的新特性,并进行一些其他API更改。

其中一个触发当前警告的更改是useNewUrlParser选项,这是由于传递连接URI的实际工作方式发生了一些更改。稍后再详细介绍。

在事情“安定下来”之前,建议至少“固定”到3.0的次要版本。x版本:

  "dependencies": {
    "mongodb": "~3.0.8"
  }

这应该会阻止3.1。X分支安装在节点模块的“新鲜”安装上。如果您已经安装了“最新”版本,即“测试版”,那么您应该清理您的包(以及包锁)。Json),并确保将其降至3.0。X系列发布。

至于实际使用"new"连接URI选项,主要的限制是在连接字符串中实际包含端口:

const { MongoClient } = require("mongodb");
const uri = 'mongodb://localhost:27017';  // mongodb://localhost - will fail

(async function() {
  try {

    const client = await MongoClient.connect(uri,{ useNewUrlParser: true });
    // ... anything

    client.close();
  } catch(e) {
    console.error(e)
  }

})()

这是新法规中更为“严格”的规定。主要的一点是,当前的代码本质上是“node-native-driver”(npm mongodb)存储库代码的一部分,而“新代码”实际上是从“支撑”“公共”节点驱动的mongodb-core库中导入的。

添加“选项”的目的是通过将选项添加到新代码中来“简化”转换,因此在添加选项和清除deprecation警告的代码中使用更新的解析器(实际上是基于url的),从而验证传入的连接字符串实际上符合新解析器的期望。

在未来的版本中,“遗留的”解析器将被删除,然后新的解析器将被简单地使用,即使没有选项。但是到那时,所有现有的代码都有足够的机会根据新的解析器的期望来测试它们现有的连接字符串。

因此,如果你想在新的驱动特性发布时就开始使用它们,那么使用可用的beta版和后续版本,理想情况下,通过在MongoClient.connect()中启用useNewUrlParser选项,确保你提供了一个对新解析器有效的连接字符串。

如果您实际上不需要访问与MongoDB 4.0预览版相关的特性,那么可以将版本固定在3.0。X系列,如前所述。这将像文档所描述的那样工作,并且“固定”这将确保3.1。X版本不会在预期的依赖关系之上“更新”,直到您真正想要安装一个稳定的版本。


检查你的mongo版本:

mongo --version

如果您使用的是>= 3.1.0版本,请将mongo连接文件更改为->

MongoClient.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true })

或者你的猫鼬连接文件到->

mongoose.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true });

理想情况下,它是版本4的特性,但v3.1.0及以上版本也支持它。详情请查看MongoDB GitHub。


没有什么可以改变的。只在连接函数中传递{useNewUrlParser: true}。

这是可行的:

    MongoClient.connect(url, {useNewUrlParser:true,useUnifiedTopology: true }, function(err, db) {
        if(err) {
            console.log(err);
        }
        else {
            console.log('connected to ' + url);
            db.close();
        }
    })

我是这么说的。直到几天前我更新了npm,这个提示才在我的控制台显示出来。

.connect有三个参数,URI, options和err。

mongoose.connect(
    keys.getDbConnectionString(),
    { useNewUrlParser: true },
    err => {
        if (err) 
            throw err;
        console.log(`Successfully connected to database.`);
    }
);

这个问题可以通过给出端口号并使用以下解析器来解决:

解决方案可以是:

mongoose.connect("mongodb://localhost:27017/cat_app", { useNewUrlParser: true });

它解决了我的问题。


我们用的是:

mongoose.connect("mongodb://localhost/mean-course").then(
  (res) => {
   console.log("Connected to Database Successfully.")
  }
).catch(() => {
  console.log("Connection to database failed.");
});

这将给出一个URL解析器错误

正确的语法是:

mongoose.connect("mongodb://localhost:27017/mean-course" , { useNewUrlParser: true }).then(
  (res) => {
   console.log("Connected to Database Successfully.")
  }
).catch(() => {
  console.log("Connection to database failed.");
});

我使用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}


下面突出显示的猫鼬连接代码解决了猫鼬驱动程序的警告:

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

这几行代码同样适用于所有其他弃用警告:

const db = await mongoose.createConnection(url, { useNewUrlParser: true });
mongoose.set('useCreateIndex', true);
mongoose.set('useFindAndModify', false);

我认为你不需要添加{useNewUrlParser: true}。

是否使用新的URL解析器由您自己决定。最终,当MongoDB切换到新的URL解析器时,这个警告就会消失。

如Connection String URI Format中所述,不需要设置端口号。

只要添加{useNewUrlParser: true}就足够了。


你需要在猫鼬.connect()方法中添加{useNewUrlParser: true}。

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

连接字符串格式为mongodb://user:password@host:port/db

例如:

MongoClient.connect('mongodb://user:password@127.0.0.1:27017/yourDB', { useNewUrlParser: true } )

如果用户名或密码有@字符,那么像这样使用它:

mongoose
    .connect(
        'DB_url',
        { user: '@dmin', pass: 'p@ssword', useNewUrlParser: true }
    )
    .then(() => console.log('Connected to MongoDB'))
    .catch(err => console.log('Could not connect to MongoDB', err));

更新为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
}

Express.js、API调用case和发送JSON内容的完整示例如下:

...
app.get('/api/myApi', (req, res) => {
  MongoClient.connect('mongodb://user:password@domain.com:port/dbname',
    { useNewUrlParser: true }, (err, db) => {

      if (err) throw err
      const dbo = db.db('dbname')
      dbo.collection('myCollection')
        .find({}, { _id: 0 })
        .sort({ _id: -1 })
        .toArray(
          (errFind, result) => {
            if (errFind) throw errFind
            const resultJson = JSON.stringify(result)
            console.log('find:', resultJson)
            res.send(resultJson)
            db.close()
          },
        )
    })
}

我使用的是猫鼬版本5。X表示我的项目。在需要mongoose包后,全局设置如下所示。

const mongoose = require('mongoose');

// Set the global useNewUrlParser option to turn on useNewUrlParser for every connection by default.
mongoose.set('useNewUrlParser', true);

在连接数据库之前,你只需要设置如下内容:

const mongoose = require('mongoose');

mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);

mongoose.connect('mongodb://localhost/testaroo');

同时,

Replace update() with updateOne(), updateMany(), or replaceOne()
Replace remove() with deleteOne() or deleteMany().
Replace count() with countDocuments(), unless you want to count how many documents are in the whole collection (no filter).
In the latter case, use estimatedDocumentCount().

下面的方法对我有用

const mongoose = require('mongoose');

mongoose.connect("mongodb://localhost/playground", { useNewUrlParser: true,useUnifiedTopology: true })
.then(res => console.log('Connected to db'));

猫鼬版本是5.8.10。


以下为我的工作 对于猫鼬版本5.9.16

const mongoose = require('mongoose');

mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);

mongoose.connect('mongodb://localhost:27017/dbName')
    .then(() => console.log('Connect to MongoDB..'))
    .catch(err => console.error('Could not connect to MongoDB..', err))

这对我来说很管用:

mongoose.set("useNewUrlParser", true);
mongoose.set("useUnifiedTopology", true);
mongoose
  .connect(db) //Connection string defined in another file
  .then(() => console.log("Mongo Connected..."))
  .catch(() => console.log(err));

const mongoose = require('mongoose');

mongoose
  .connect(connection_string, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    useFindAndModify: false,
  })
  .then((con) => {
    console.log("connected to db");
  });

试着用这个


(node:16596) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect. (Use node --trace-deprecation ... to show where the warning was created) (node:16596) [MONGODB DRIVER] Warning: Current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.

用法:

async connect(connectionString: string): Promise<void> {
        this.client = await MongoClient.connect(connectionString, {
    useUnifiedTopology: true,
    useNewUrlParser: true,
  })
        this.db = this.client.db()
}