Избегайте предупреждения "текущий синтаксический анализатор 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.

Временное решение

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

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

Ответы

Ответ 1

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

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.

Ответ 2

Как отмечалось, релиз версии 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 выпуском версии 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.0.x как было отмечено ранее. Это будет документироваться и "закреплять" это гарантирует, что версии 3.1.x не будут "обновлены" по ожидаемой зависимости, пока вы действительно не захотите установить стабильную версию.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

например:

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

Ответ 7

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

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

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

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

Ответ 8

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

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

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

Ответ 9

Обновлен для 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
}

Ответ 10

Ниже приведен полный пример для 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()
          },
        )
    })
}

Ответ 11

Здесь, как у меня, подсказка не показывалась на моей консоли, пока я не обновил npm пару дней назад.

.connect имеет 3 параметра, URI, параметры и err.

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

Ответ 12

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

Ответ 13

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

{useNewUrlParser: true}

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

Ответ 14

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

module.exports = {
  mongoURI: "mongodb://username:[email protected]:47267/projectname"
};

Ответ 15

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

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

Ответ 16

Я использую версию 5.x mongoose для своего проекта. После запроса пакета mongoose установите значение глобально, как показано ниже.

const mongoose = require('mongoose');

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

Продолжай улыбаться, приятель :)

Ответ 17

Если 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));