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

Lio*_*ion 210 mongoose mongodb node.js express typescript

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

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

这给了我一个警告:

(node: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/mongodb3.0.18.它们都是最新的可用npm install.

解决方法

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

connect()

Abh*_*nha 368

检查你的mongo版本

mongo --version
Run Code Online (Sandbox Code Playgroud)

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

MongoClient.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true })
Run Code Online (Sandbox Code Playgroud)

或者您的mongoose连接文件 - >

mongoose.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true });
Run Code Online (Sandbox Code Playgroud)

理想情况下,它是版本4的功能,但v3.1.0及更高版本也支持它.查看MongoDB Github 了解详细信息.

  • 这是最好的,只是想添加,如果有回调,尤其是错误,请使用此命令:mongoose.connect(dbUrl,{useNewUrlParser:true},function(err){console.log(“ mongoDB connected”,呃); }) (3认同)

Nei*_*unn 45

正如所指出的那样,3.1.0-beta4驱动程序的发布在事物看起来早一点"释放到野外".该版本是正在进行的工作的一部分,以支持MongoDB 4.0即将发布的版本中的新功能,并进行一些其他API更改.

触发当前警告的一个这样的更改是useNewUrlParser选项,因为关于如何传递连接URI实际工作的一些变化.稍后会详细介绍.

在事情"稳定下来"之前,最好将"固定"至少3.0.x发布的次要版本:

  "dependencies": {
    "mongodb": "~3.0.8"
  }
Run Code Online (Sandbox Code Playgroud)

这应该会阻止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)
  }

})()
Run Code Online (Sandbox Code Playgroud)

这是新代码中更"严格"的规则.重点是当前代码本质上是"节点本机驱动程序"(npm mongodb)存储库代码的一部分,而"新代码"实际上是从mongodb-core"支持""公共"节点驱动程序的库中导入的.

添加"选项"的要点是通过向新代码添加选项来"缓解"转换,以便url在添加选项和清除弃用警告的代码中使用较新的解析器(实际上基于),从而验证传入的连接字符串实际上符合新解析器的期望.

在将来的版本中,将删除"遗留"解析器,然后即使没有该选项,新解析器也将简单地使用.但到那时,预计所有现有代码都有充分的机会根据新解析器所期望的内容测试现有连接字符串.

因此,如果您希望在发布时使用新的驱动程序功能,请使用可用的beta和后续的版本,理想情况下,通过启用该useNewUrlParser选项,确保提供对新解析器有效的连接字符串MongoClient.connect().

如果您实际上不需要访问与MongoDB 4.0发行版预览相关的功能,请将版本固定3.0.x为前面提到的系列.这将按照记录的方式工作,并且"固定"这可以确保3.1.x在您真正想要安装稳定版本之前,版本不会在预期的依赖关系上"更新".

  • @Wyck当然,“参考”是在询问问题时,执行“ npm install mongodb”,导致安装了**“ beta” **(在问题中显示的版本字符串中明确标记)。不应该在npm存储库中被标记为“稳定”。当时确实确实是一个“错误”,应始终予以考虑,因此,如果在版本字符串中任何显示“ alpha”或“ beta”的代码版本都被类似地标记为“稳定”。自然,时间已经过去,并且这是稳定版本中的一项功能,直到(最终指出)它最终消失。 (2认同)

Nar*_*aru 43

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

mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
Run Code Online (Sandbox Code Playgroud)

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

小智 22

无需更改,只在connect函数中传递,{useNewUrlParser: true }这将起作用

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


S J*_*S J 22

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

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');
Run Code Online (Sandbox Code Playgroud)

还,

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().
Run Code Online (Sandbox Code Playgroud)

  • 应该是最上面的答案。所有其他答案对我来说都惨败。 (4认同)

KAR*_*N.A 17

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

mongoose.connect('mongodb://localhost:27017/Notification',{ useNewUrlParser: true });
Run Code Online (Sandbox Code Playgroud)


Bor*_*jić 15

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

例如:

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


cod*_*ogs 11

以下对我有用

const mongoose = require('mongoose');

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

mongoose版本5.8.10


Sam*_*Sam 8

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

如果你想使用新的url解析器,这取决于你.最终,当mongo切换到新的url解析器时,警告将消失.

编辑:如此 处所指定https://docs.mongodb.com/master/reference/connection-string/您无需设置端口号.

只需添加即可{ useNewUrlParser: true }.

  • 好问题!请注意,这是一个警告.不是错误.只有通过添加`useNewUrlParser:true`,警告才会消失.但是这有点愚蠢,因为一旦mongo切换到新的url解析器,这个额外的参数将变得过时. (2认同)

mik*_*ana 8

已为ES8更新/等待

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

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
}
Run Code Online (Sandbox Code Playgroud)


Meh*_*lah 7

通过提供端口号并使用此解析器{useNewUrlParser:true}可以解决该问题.解决方案可以是:

mongoose.connect("mongodb://localhost:27017/cat_app", { useNewUrlParser: true });
Run Code Online (Sandbox Code Playgroud)

它解决了我的问题.

  • 控制台本身提供了在`connect`中添加`useNewUrlParser property`的解决方案,但是您的解决方案有所帮助。好赞! (2认同)

Rom*_*man 7

expressJS,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()
          },
        )
    })
}
Run Code Online (Sandbox Code Playgroud)


小智 7

以下mongoose版本对我有用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))
Run Code Online (Sandbox Code Playgroud)


AGr*_*ush 5

您只需要添加

{useNewUrlParser:true}

在mongoose.connect方法内部