当前位置: 首页 > 知识库问答 >
问题:

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

汪驰
2023-03-14

我有一个数据库包装类,它建立到某个MongoDB实例的连接:

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

这给了我一个警告:

(节点:4833)DeprecationWarning:当前URL字符串解析器不推荐使用,将在未来版本中删除。若要使用新的解析器,请将选项{usenewurlParser:true}传递给MongoClient.Connect。

connect()方法接受MongoClientOptions实例作为第二个参数。但它没有名为usenewurlparser的属性。我还尝试在连接字符串中设置这些属性,如下所示:mongoDB://127.0.0.1/my-db?usenewurlparser=true,但它对这些警告没有影响。

那么如何设置usenewurlparser来删除这些警告呢?这对我很重要,因为脚本应该以cron运行,而这些警告会导致垃圾邮件。

我在3.1.0-beta4版本中使用MongoDB驱动程序,在3.0.18版本中使用相应的@types/mongoDB包。这两个都是使用NPM Install提供的最新版本。

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

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

共有3个答案

陈淳
2023-03-14

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

mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
唐阳晖
2023-03-14

正如前面提到的,驱动程序的3.1.0-beta4发行版从表面上看有点早。该发行版是支持MongoDB4.0即将发布的版本中的更新特性并进行一些其他API更改的工作的一部分。

触发当前警告的一个此类更改是usenewurlparser选项,这是因为在传递连接URI的实际工作方式方面发生了一些变化。稍后再谈。

在事情“解决”之前,最好至少“pin”到3.0.x版本的次要版本:

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

这将停止在节点模块的“新鲜”安装上安装3.1.x分支。如果您已经安装了一个“最新”版本,即“beta”版本,那么您应该清理您的软件包(和package-lock.json),并确保将其压缩到3.0.x系列版本。

至于实际使用“新”连接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”(npmMongoDB)存储库代码的一部分,而“新代码”实际上是从MongoDB-Core库导入的,该库“支持”“公共”节点驱动程序。

添加“选项”的目的是通过将选项添加到新代码来“简化”转换,从而在代码中使用较新的解析器(实际上基于URL),添加选项并清除不推荐警告,从而验证传入的连接字符串是否符合新解析器的预期。

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

因此,如果您想在新的驱动程序特性发布时开始使用它们,那么请使用可用的beta和后续版本,并且最好通过启用MongoClient.Connect()中的useNewurlParser选项,确保您提供了一个对新的解析器有效的连接字符串。

如果您实际上不需要访问与MongoDB 4.0版本预览有关的特性,那么请将该版本定位到前面提到的3.0.x系列。这将按照文档的规定工作,“钉扎”这将确保3.1.x版本不会在预期的依赖项上“更新”,直到您真正想要安装一个稳定的版本。

黄德明
2023-03-14

检查您的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了解详细信息。

 类似资料:
  • 我们有一个Java项目。我们为javac启用了Xlint(启用警告)和Werror(将警告视为错误)标志,以确保我们的代码没有警告。最近我们决定不推荐一个类。问题是在某些情况下,SuppressWarnings(“弃用”)根本不会抑制弃用警告,从而导致生成失败。下面是我遇到的用例列表: > 在其他未弃用的类中导入。 在其他已弃用的类中导入。 家长班。 类型参数。例如 但是,即使没有“抑制”,此选项

  • 我有一个输入json字符串,其中包含几个已经转义的特殊字符和一些未转义的特殊字符(如en-dash/em-dash)。解析此json字符串(需要解析此字符串以检索对象数组)后,它将具有特殊字符的字符串转换为Unicode值(例如,将短划线字符转换为2013)。我的要求是不要转义任何特殊字符,并保持其他已转义字符不变。简单来说,在解析JSON字符串后,内容不应更改。 请建议一些方法来处理这个问题。

  • 问题内容: 有没有简单的方法来实现具有以下签名的方法?至少,实现需要处理原始类型(例如Double和Integer)。非原始类型将是一个不错的选择。 对于实现了FromString接口(或等效项)的对象,实现将是微不足道的,但是我还没有发现任何此类东西。我还没有找到使用反射的功能实现。 问题答案: 仅当您提供其他参数时才有可能。它本身不包含有关所需返回类型的任何信息。 然后,您可以通过来确定类型。

  • 您在配置/应用程序中放置了类似的内容。rb 此时仍会出现警告:

  • 问题内容: 我正在处理一种加密货币RPC并接收json数据,如下所示: 使用Jsoncpp库或json11会将数字解析为。发生这种情况时,由于双重精度问题,结果为:。总的来说,这对金融交易来说是灾难性的,是不可接受的。 我已经有一个定点库,可以使用有效的字符串并将其在内部视为整数。有没有一种方法可以使Jsoncpp(或其他任何json库)将选定的数字json值用作字符串,以便可以使用固定精度正确地