避免"当前的URL字符串解析器已被弃用"将useNewUrlParser设置为true

时间:2018-05-21 11:50:41

标签: node.js mongodb typescript express mongoose

我有一个数据库包装类,它建立了与某些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来删除这些警告?这对我很重要,因为脚本应该以cron身份运行,而这些警告会导致垃圾邮件垃圾邮件。

我在版本mongodb中使用3.1.0-beta4驱动程序,并在@types/mongodb中使用相应的3.0.18包。它们都是使用npm install的最新版本。

解决方法

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

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

23 个答案:

答案 0 :(得分:323)

检查您的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 :(得分:40)

如上所述,驱动程序的3.1.0-beta4版本被释放到了野外&#34;事情看起来有点早。该版本是正在进行的工作的一部分,以支持MongoDB 4.0即将发布的版本中的新功能,并进行一些其他API更改。

触发当前警告的一个此类更改是useNewUrlParser选项,因为有关如何传递连接URI实际工作的一些更改。稍后会详细介绍。

直到&#34;安定下来&#34;,对3.0.x版本的次要版本至少advisable to "pin"

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

这应该会阻止3.1.x分支安装在&#34; fresh&#34;安装到节点模块。如果您已经安装了最新的&#34;发布的是&#34; beta&#34;版本,那么你应该清理你的包(和package-lock.json),并确保将其降低到3.0.x系列版本。

至于实际使用&#34; new&#34;连接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)
  }

})()

这是一个更严格的&#34;在新代码中规则。重点是当前代码基本上是&#34; node-native-driver&#34; (npm mongodb)存储库代码和&#34;新代码&#34;实际上从mongodb-core库中导入了#34;支持&#34; &#34;公众&#34;节点驱动程序。

&#34;选项的重点&#34;被添加是为了“轻松”#34;通过向新代码添加选项来实现转换,以便在添加选项和清除弃用警告的代码中使用较新的解析器(实际上基于url),从而验证传入的连接字符串是否实际符合新的解析器期待。

在未来的版本中,&#39;遗产&#39;将删除解析器,然后即使没有该选项,新解析器也将简单地使用。但到那时,预计所有现有代码都有足够的机会根据新解析器期望的内容测试现有的连接字符串。

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

如果您实际上不需要访问与预览MongoDB 4.0版本相关的功能,请将版本固定为3.0.x系列,如前所述。这将按照记录和&#34;固定&#34;这可确保3.1.x版本不会更新&#34;超出预期的依赖关系,直到你真的想要安装一个稳定的版本。

答案 2 :(得分:34)

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

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

答案 3 :(得分:16)

没什么改变,只在连接功能{useNewUrlParser: true }中传递即可

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

答案 4 :(得分:16)

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

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

答案 5 :(得分:15)

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

例如:

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

答案 6 :(得分:11)

以下对我有用的

const mongoose = require('mongoose');

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

mongoose版本为5.8.10

答案 7 :(得分:8)

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

要由您自己决定是否要使用新的URL解析器。最终,当mongo切换到新的网址解析器时,警告将消失。

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

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

答案 8 :(得分: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))

答案 9 :(得分:7)

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

    {
 "query": {

         "query_string": {
          "fields": ["title",  "content"],
          "query": "xyz"
          }
   }

它解决了我的问题。

答案 10 :(得分:6)

已针对ES8更新/等待

错误的ES8 demo code MongoDB inc provides也会创建此警告。

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
}

答案 11 :(得分:4)

.gap {
  display: none;
}

答案 12 :(得分:4)

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

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

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

答案 13 :(得分:3)

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

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

答案 14 :(得分:2)

您只需要添加

  

{useNewUrlParser:true}

在mongoose.connect方法内部

答案 15 :(得分:1)

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()
        },
      )
  })
}

答案 16 :(得分: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);

保持微笑的伙伴:)

答案 17 :(得分:1)

这很适合我:

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));

答案 18 :(得分:1)

const mongoose = require('mongoose');

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

尝试使用这个

答案 19 :(得分:0)

我使用mlab.com作为mongo数据库。我将连接字符串分离到另一个名为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();

//DB config
const db = require("./config/keys").mongoURI;

//connect to mongo DB

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}`)); //tilda not inverted comma

您需要像上面一样在连接字符串后编写{useNewUrlParser:true}。

简单地说,您需要做的事情:

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


      

答案 20 :(得分:0)

如果usernamepassword具有@字符。然后像这样使用

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));

答案 21 :(得分:0)

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

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

答案 22 :(得分:0)

<块引用>

(node:16596) DeprecationWarning: 当前 URL 字符串解析器是 已弃用,并将在未来版本中删除。要使用新 解析器,将选项 { useNewUrlParser: true } 传递给 MongoClient.connect。 (使用 node --trace-deprecation ... 显示警告的位置 创建)(节点:16596)[MONGODB DRIVER]警告:当前服务器 发现和监控引擎已弃用,并将在 未来的版本。使用新的服务器发现和监控 引擎,将选项 { useUnifiedTopology: true } 传递给 MongoClient 构造函数。

用法:

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