通过将"useNewUrlParser"设置为true来避免“当前URL字符串解析器已弃用”的警告。

279

我有一个数据库包装类,它建立到某些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 但对这些警告没有影响。

那么我该如何设置 useNewUrlParser 来消除这些警告呢?这对我很重要,因为脚本应该作为计划任务运行,而这些警告会导致垃圾邮件满天飞。

我正在使用版本为 3.1.0-beta4mongodb 驱动程序,以及相应的 @types/mongodb 包在 3.0.18 中。它们都是使用 npm install 安装的最新版本。

解决方法

使用较旧版本的 mongodb 驱动程序:

"mongodb": "~3.0.8",
"@types/mongodb": "~3.0.18"

6
这是从 beta 版本中某种方式在周末发布到 npm 上的内容。在 API 确实最终确定之前,不要担心它。你做得很对,安装了一个稳定版本。 - Neil Lunn
1
在MongoDB 3.0.0以上的版本中,只需添加以下代码即可连接数据库: mongoose.connect("mongodb://localhost:portnumber/YourDB", { useNewUrlParser: true }) - Majedur
22个回答

447

检查您的 mongo 版本:

mongo --version

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

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

或者你的mongoose连接文件到 ->

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

理想情况下,这是4版本的功能,但v3.1.0及以上版本也支持它。请查看MongoDB GitHub获取详细信息。


1
@AbhishekSinha 为什么要使用mongo >= 4.0.0?我正在使用3.6.5,烦人的消息也消失了。 - greuze
好的,已经修复了。基本上,这是一个v4的功能,但v3.1.0及以上版本也支持这个新功能。 - Abhishek Sinha
3
这是最好的,只想补充一点,如果你需要回调函数来处理错误,只需使用以下代码: mongoose.connect(dbUrl, { useNewUrlParser: true }, function(err) { console.log("mongoDB connected", err); }) - ptts

51

如注释所说,驱动程序的3.1.0-beta4版本看起来有点早发布了。该版本是正在进行的工作的一部分,以支持MongoDB 4.0即将推出的新功能并进行其他API更改。

导致当前警告的其中一个更改是useNewUrlParser选项,由于传递连接URI的方式发生了一些变化。稍后会详细介绍。

在事情“稳定下来”之前,建议至少针对3.0.x版本的次要版本进行“固定”,具体请参考此处

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

这将阻止在“新的”模块节点安装3.1.x分支。如果您已经安装了“最新”的版本,即“beta”版本,则应清理您的软件包(和package-lock.json),并确保将其降级到3.0.x系列版本。

至于实际使用“新”的连接URI选项,主要限制是在连接字符串中实际包括port

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库进行导入,该库是“公共”节点驱动程序的基础。

添加“option”的目的是通过为新代码添加选项来“简化”转换,使新解析器(实际上基于url )在添加选项的代码中被使用,并清除弃用警告,因此验证传递的连接字符串实际上符合新解析器所期望的内容。

在未来的版本发布中,“遗留”解析器将被删除,然后新解析器将成为即使没有选项也会被使用的内容。但到那个时候,预计所有现有的代码都有充足的机会根据新解析器所期望的内容测试其现有的连接字符串。

因此,如果您想开始使用随着发布而发布的新驱动程序功能,则使用可用的beta和后续版本,并最好确保您提供的连接字符串对于新解析器是有效的,方法是在MongoClient.connect()中启用 useNewUrlParser选项。

如果您实际上不需要访问与MongoDB 4.0预览相关的功能,则像前面提到的那样将版本固定为3.0.x系列。这将按照文档工作,并且“固定”这一点确保3.1.x发布不会被期望的依赖项“更新”,直到您实际上想安装稳定版本。


1
你能否提供更多关于“released into the wild”的信息?3.1.0-beta4是如何从动物园逃脱的?你能引用一些相关资料吗? - Wyck
2
@Wyck 当时问题被提出时,“reference”当然是指执行npm install mongodb会导致安装“beta版”(在问题中显示的版本字符串中清楚地标记为“beta”),因为它在npm存储库中被标记为“稳定版”,但实际上不应该是这样。这确实是一个错误,如果任何代码发布显示版本字符串中带有“alpha”或“beta”,并且同样被标记为稳定,则始终应将其视为错误。自然而然,时间过去了,现在这是稳定版本的一个功能,直到(如注所述)最终消失。 - Neil Lunn

47
下面突出显示的 mongoose 连接代码解决了 mongoose 驱动程序的警告:
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });

5
对我没用。仍会获取:(node:35556)DeprecationWarning:当前的URL字符串解析器已弃用,将在未来的版本中删除。要使用新的解析器,请传递选项{useNewUrlParser:true}到MongoClient.connect。 - Alex
如果仍然无法正常工作,请尝试通过输入npm install来删除并重新安装node_modules,只要您的package.json文件存在,您就必须在给出DB路径的任何地方保存server.js或app.js。 - Narendra Maru

31

没什么需要更改的。只需在连接函数中传递{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();
        }
    })

正是我所需要的,但警告信息仍然存在 :-S - alex351
对我来说可以运行,不再有任何警报。 - Q. Qiao

23

在连接到数据库之前,您只需要设置以下内容:

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().

4
应该是最佳答案。对我来说,所有其他答案都失败了。 - Anthony
1
如果这个答案对你有用,请将其标记为“正确”。它对我也起作用了! - Arpan Banerjee

20

mongoose.connect()方法中添加{ useNewUrlParser: true }

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

1
这个答案与几个月前发布的其他答案相同。 - Daniel W.
这与之前的答案有何不同? - Peter Mortensen
@PeterMortensen请检查谁先发布了答案的日期。 - KARTHIKEYAN.A

16
连接字符串格式必须为 mongodb://user:password@host:port/db
例如:
MongoClient.connect('mongodb://user:password@127.0.0.1:27017/yourDB', { useNewUrlParser: true } )

不需要使用mongooseMongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } )也可以。 - Nino Filiu
这和之前的答案有什么不同? - Peter Mortensen

10

以下对我有效

const mongoose = require('mongoose');

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

mongoose 版本是 5.8.10


1
这个也对我有用。我正在使用-- body-parser": "^1.19.0", "express": "^4.17.1", "mongoose": "^5.9.14" - Arpan Banerjee

8

该问题可以通过提供端口号并使用以下解析器来解决:{useNewUrlParser: true}

解决方法可能如下:

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

它解决了我的问题。

3
控制台本身提供了在connect中添加 useNewUrlParser属性的解决方案,但是您提供的解决方案也很有帮助。所以我点了个赞! - GD- Ganesh Deshmukh

8
我认为您不需要添加{ useNewUrlParser: true }
如果您想要使用新的URL解析器,那就随你便。当MongoDB切换到他们的新URL解析器时,警告将会消失。
根据连接字符串URI格式的规定,您不需要设置端口号。
只需添加{ useNewUrlParser: true }就足够了。

1
我已经添加了端口号,但仍然收到错误消息。我发现错误消息非常令人困惑和误导:为什么会提示我使用新格式,而事实上我正在使用旧格式并且它完美地工作...!!?? - Nico
2
好问题!请注意,这是一个警告而不是错误。只有添加 useNewUrlParser: true 才能消除警告。但这有点愚蠢,因为一旦Mongo切换到他们的新URL解析器,这个额外的参数就会变得过时。 - Sam
你是怎么知道端口号是新 URL 解析器期望的内容的?我找不到任何描述新 URL 解析器的东西。 - bluegreen
@Brad,确实如此。我原以为您需要添加端口号,但Mongo规范仍将端口号视为可选项。我已相应地更新了我的答案。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接