it-swarm.com.ru

Избегайте предупреждения "Текущий анализатор строк URL устарел", установив для useNewUrlParser значение true

У меня есть класс-оболочка базы данных, который устанавливает соединение с некоторым экземпляром 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.

Workaround

Использование более старой версии драйвера mongodb:

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

133
Lion

Проверьте свою версию Монго 

mongo --version

Если вы используете версию> = 3.1.0, измените файл подключения к Монго на ->

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

или ваш файл подключения mongoose к ->

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

В идеале это функция версии 4, но ее поддерживает и версия 3.1.0 и выше. Проверьте MongoDB Github для деталей.

277
Abhishek Sinha

Как отмечалось, релиз драйвера 3.1.0-beta4 был "выпущен в дикую природу" немного раньше, судя по всему. Релиз является частью незавершенной работы по поддержке новых функций в предстоящем выпуске MongoDB 4.0 и внесению некоторых других изменений в API.

Одним из таких изменений, запускающих текущее предупреждение, является опция useNewUrlParser, из-за некоторых изменений в том, как на самом деле работает передача URI соединения. Подробнее об этом позже.

Пока все не «успокоится», вероятно, желательно «прикрепить» по крайней мере к младшей версии для 3.0.x выпусков:

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

Это должно остановить установку ветки 3.1.x на «свежих» установках узловых модулей. Если вы уже установили «последний» выпуск, который является «бета-версией», то вы должны очистить свои пакеты (и 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 , которая «лежит в основе» «публичный» узел драйвера.

Смысл добавления «опции» состоит в том, чтобы «облегчить» переход, добавив эту опцию в новый код, чтобы новый синтаксический анализатор (фактически основанный на url ) использовался в коде, добавляющем опцию и очищающем предупреждение об устаревании и, следовательно, проверка того, что передаваемые строки соединения действительно соответствуют ожиданиям нового синтаксического анализатора.

В будущих выпусках парсер 'legacy' будет удален, и тогда новый парсер будет просто тем, что используется даже без опции. Но к тому времени ожидается, что весь существующий код будет иметь достаточно возможностей для проверки существующих строк подключения на соответствие ожиданиям нового синтаксического анализатора.

Поэтому, если вы хотите начать использовать новые функции драйверов по мере их выпуска, используйте доступные beta и последующие выпуски и в идеале убедитесь, что вы предоставляете строку подключения, которая действительна для нового анализатора, включив параметр useNewUrlParser в MongoClient.connect().

Если вам на самом деле не нужен доступ к функциям, связанным с предварительным просмотром выпуска MongoDB 4.0, прикрепите версию к серии 3.0.x, как отмечалось ранее. Это будет работать так, как задокументировано, и «закрепление» гарантирует, что выпуски 3.1.x не будут «обновлены» в зависимости от ожидаемой зависимости, пока вы действительно не захотите установить стабильную версию.

38
Neil Lunn

Ниже выделенный код для подключения мангуста решено предупреждение для водителя мангуста

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

Формат строки подключения должен быть mongodb: // пользователь: пароль @ Хост: порт/db  

например:

MongoClient.connect('mongodb://user:[email protected]:27017/yourDB', { useNewUrlParser: true } )
15
Boris Traljić

Необходимо добавить{ useNewUrlParser: true }в метод mongoose.connect ().

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

Ничего не менять, передать только в функцию подключения {useNewUrlParser: true } это будет работать 

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

Проблема может быть решена путем указания номера порта и использования этого синтаксического анализатора {UseNewUrlParser: true} . Решение может быть:

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

Это решает мою проблему.

7
Mehedi Abdullah

Я не думаю, что вам нужно добавлять { useNewUrlParser: true }.

Вам решать, хотите ли вы уже использовать новый анализатор URL. В конце концов, предупреждение исчезнет, ​​когда Монго переключится на свой новый парсер URL.

Edit: Как указано здесь https://docs.mongodb.com/master/reference/connection-string/ вам не нужно устанавливать номер порта.

Достаточно просто добавить { useNewUrlParser: true }.

6
Sam

Вот как у меня получилось, подсказка не отображалась на моей консоли, пока я не обновил npm пару дней назад. 

.connect имеет 3 параметра, URI, параметры и ошибку. 

mongoose.connect(
    keys.getDbConnectionString(),
    { useNewUrlParser: true },
    err => {
        if (err) throw err;
        console.log(`Successfully connected to database.`);
    }
);
4
Hashasaur
**We were using** 
mongoose.connect("mongodb://localhost/mean-course").then(
  (res) => {
   console.log("Connected to Database Successfully.")
  }
).catch(() => {
  console.log("Conntection to database failed.");
});

*-----> This gives url parser error*



**Correct Syntax is**:

mongoose.connect("mongodb://localhost:27017/mean-course" , { useNewUrlParser: true }).then(
  (res) => {
   console.log("Connected to Database Successfully.")
  }
).catch(() => {
  console.log("Conntection to database failed.");
});
3
BASANT KUMAR

вам просто нужно добавить

{useNewUrlParser: true}

внутри метода mongoose.connect

2
JakeS

Обновлен для ES8/жду

Неправильный демонстрационный код ES8, предоставляемый MongoDB inc также создает это предупреждение. 

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
}
2
mikemaccana

Ниже приведен полный пример для ExpressJS, случая вызова API и отправки JSON:

...
app.get('/api/myApi', (req, res) => {
  MongoClient.connect('mongodb://user:[email protected]: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()
        },
      )
  })
}
1
Roman

Эти строки сделали свое дело для всех других предупреждений об устаревании:

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

Если username или password имеет символ @. Тогда используйте как это

mongoose
    .connect(
        'DB_url',
        { user: '@dmin', pass: '[email protected]', useNewUrlParser: true }
    )
    .then(() => console.log('Connected to MongoDB'))
    .catch(err => console.log('Could not connect to MongoDB', err));
0
Saahithyan Vigneswaran

Я использовал mlab.com в качестве базы данных Монго. Я отделил строку подключения от другой папки с именем config и внутри keys.js. Я сохранил строку подключения, которая была 

module.exports = {
  mongoURI: "mongodb://username:[email protected]: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 } 


      

0
zibon