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


239

我有一个数据库包装器类,用于建立与某些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运行,并且这些警告会导致垃圾邮件垃圾邮件。

我正在使用mongodb版本中的驱动程序3.1.0-beta4和中的相应@types/mongodb软件包3.0.18。两者都是的最新版本npm install

解决方法

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

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

5
这来自beta周末以某种方式在npm上发布的版本。在API最终确定之前,不必担心。您安装了稳定版本的操作正确。
尼尔·伦

1
在mongodb的3.0.0之上,只需添加mongoose.connect(“ mongodb:// localhost:portnumber / YourDB”,{useNewUrlParser:true})
Majedur Ra​​haman

Answers:


402

检查您的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 以获取详细信息。


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

谢谢,像专家一样固定
Hidayt Rahman

46

如前所述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)存储库代码的一部分,而“ new code”实际上是从mongodb-core库中导入的,从而“巩固”了“ public”节点驱动程序。

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

在将来的版本中,将删除“旧式”解析器,然后即使没有该选项,也将使用新的解析器。但是到那时,可以预期所有现有代码都有足够的机会根据新解析器的预期测试其现有连接字符串。

因此,如果您要在发布新的驱动程序功能时开始使用它们,请使用可用的beta版本和后续版本,并且最好通过启用中的useNewUrlParser选项来确保您提供的连接字符串对新的解析器有效MongoClient.connect()

如果您实际上不需要访问与MongoDB 4.0发行版预览有关的功能,请将该版本固定到3.0.x前面提到的系列。这将按文档所述进行,并且“固定”这可确保3.1.x在您实际要安装稳定的版本之前,不会在预期的依赖项上“更新”发行版。


1
当您说“释放到野外”时,您是否了解您的意思?3.1.0-beta4如何逃离动物园?你能引用任何参考吗?
Wyck

2
@Wyck当然,“参考”是在问问题时,npm install mongodb由于安装了“ beta”(在问题中显示的版本字符串中明确标记),因此安装了“ beta”,因为它stable在npm存储库中被标记为不应该。当时确实确实是一个错误,应该始终考虑,因此,如果显示alphabeta版本字符串中的任何代码发行版被类似地标记为稳定。自然,时间已经过去,并且这是稳定版本中的一项功能,直到最终消失(如前所述)。
尼尔·伦

45

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

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

4
不为我工作。仍然得到:(节点:35556)DeprecationWarning:不建议使用当前URL字符串解析器,并将在以后的版本中将其删除。要使用新的解析器,请将选项{useNewUrlParser:true}传递给MongoClient.connect。
亚历克斯

如果您仍然无法提供数据库路径,则必须保存server.js或app.js,如果仍然无法正常运行,请尝试通过package.json文件输入npm install删除并重新安装node_modules的方式
Narendra Maru,

24

没有任何改变。仅通过connect函数{useNewUrlParser: true }

这将起作用:

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

正是我所需要的,但是警告消息仍然存在:-S
alex351 '18

为我工作,不再发出警告。
Q. Qiao

17

您需要添加{ useNewUrlParser: true }mongoose.connect()方法。

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

1
这个答案是一样的已张贴在几个月前其他的答案
丹尼尔W.

这与以前的答案有何不同?
Peter Mortensen

@PeterMortensen请检查第一个发布答案的日期
KARTHIKEYAN.A

15

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

例如:

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

MongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } )也可以。
Nino Filiu

这与以前的答案有何不同?
Peter Mortensen

15

您只需按以下步骤设置以下各项即可连接到数据库:

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

3
应该是最佳答案。对我而言,所有其他答案都惨败。
安东尼

请标记ans,correct好像它对您有用。它也为我工作!
Arpan Banerjee

9

以下对我有用

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 }

如果您想已经使用新的URL解析器,则取决于您。最终,当MongoDB切换到其新的URL解析器时,警告将消失。

如“ 连接字符串URI格式”中指定的那样,您无需设置端口号。

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


1
我已经添加了端口号,但仍然收到错误消息。我发现错误消息非常令人困惑和误导:为什么我收到一条消息,告诉我使用新格式,而实际上我使用的是旧格式,所以效果很好... !! ??
Nico

2
好问题!请注意,这是一个警告。没错 只有添加useNewUrlParser: true警告,警告才会消失。但这有点愚蠢,因为一旦mongo切换到其新的URL解析器,此额外的参数将被淘汰。
山姆

您怎么知道端口号是新的URL解析器所期望的?我找不到任何实际介绍了新的URL解析器是什么
布拉德

确实,@布拉德。我以为您需要添加端口号,但是Mongo规范仍然提到端口号是可选的。我相应地更新了我的答案。
山姆

8

已针对ECMAScript 8更新/等待

MongoDB inc提供的错误ECMAScript 8演示代码也会创建此警告。

MongoDB提供以下建议,这是不正确的

要使用新的解析器,请将选项{useNewUrlParser:true}传递给MongoClient.connect。

这样做会导致以下错误:

TypeError:的最终参数executeOperation必须是回调

相反,必须将选项提供给new 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
}

7

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

解决方案可以是:

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

它解决了我的问题。


3
控制台本身了一些解决方案中添加useNewUrlParser propertyconnect,但你的解决方案帮助。好赞!
ganeshdeshmukh '18

7

Express.js,API调用案例和发送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()
          },
        )
    })
}

4

这就是我的方法。直到我几天前更新npm时,该提示才在控制台上显示。

.connect具有三个参数,即URI,选项和err。

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

4

我们正在使用:

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

1
添加一些描述
Mathews


2

以下版本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))

1

这些行也适用于所有其他弃用警告:

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

1

我使用mlab.com作为MongoDB数据库。我将连接字符串分离到另一个名为的config文件夹中,并在文件keys.js中,我保留了连接字符串:

module.exports = {
  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}。

简而言之,您需要执行以下操作:

mongoose.connect(connectionString,{ useNewUrlParser: true } 
// Or
MongoClient.connect(connectionString,{ useNewUrlParser: true } 
    


1

我正在为项目使用猫鼬版本5.x。要求使用猫鼬包装后,请如下全局设置值。

const mongoose = require('mongoose');

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.