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

126

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

  • 5
    Это происходит от beta версии, которая так или иначе была выпущена на npm в течение выходных. Не беспокойтесь об этом, пока API фактически не будет завершен. Вы правильно сделали, установив стабильную версию.
  • 1
    выше 3.0.0 mongodb просто добавьте mongoose.connect ("mongodb: // localhost: portnumber / YourDB", {useNewUrlParser: true})
Теги:
express
mongoose

14 ответов

248

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

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.

  • 0
    Это не работает ...
  • 0
    Он должен работать. Какую ошибку вы получаете?
Показать ещё 3 комментария
37

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

  • 1
    У вас есть больше информации о том, что вы имеете в виду, когда говорите «выпущен на волю»? Как 3.1.0-бета4 вырвался из зоопарка? Можете ли вы привести какие-либо ссылки на это?
  • 2
    Слишком много двойных кавычек.
17

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

mongoose.connect('mongodb://localhost:27017/CGtruCust', { useNewUrlParser: true });
  • 0
    не работает для меня. все еще получает: (узел: 35556) DeprecationWarning: текущий анализатор строки URL устарел и будет удален в будущей версии. Чтобы использовать новый синтаксический анализатор, передайте опцию {useNewUrlParser: true} в MongoClient.connect.
15

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

например:

MongoClient.connect('mongodb://user:[email protected]:27017/yourDB', { useNewUrlParser: true } )
  • 0
    Нет. MongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } ) тоже работает.
14

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

mongoose.connect('mongodb://localhost:27017/Notification',{ useNewUrlParser: true });
  • 0
    этот ответ такой же, как и другие ответы, которые были опубликованы несколько месяцев назад
11

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

MongoClient.connect(url,{ useNewUrlParser: true },function(err,db){
  if(err){
      console.log(err);
  }
  else {
      console.log('connected to '+ url);
      db.close();
  }
})
  • 0
    Как раз то, что мне было нужно, но предупреждающее сообщение все еще там: -S
  • 0
    У меня работает, предупреждений больше нет.
7

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

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

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

  • 1
    Сама консоль дала решение добавить useNewUrlParser property в connect , но ваше решение помогло. так что проголосовал!
  • 1
    Спасибо Мехеди, добавив номер порта, добился цели.
Показать ещё 1 комментарий
5

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

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

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

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

  • 1
    Я добавил номер порта и все еще получаю сообщение об ошибке. Я нахожу сообщение об ошибке очень запутанным и вводящим в заблуждение: почему я получаю сообщение, говорящее мне, чтобы использовать новый формат, когда на самом деле я использую старый формат, и он отлично работает ... !! ??
  • 2
    Хороший вопрос! Обратите внимание, что это предупреждение. Не ошибка Только добавив useNewUrlParser: true , предупреждение исчезнет. Но это немного глупо, так как этот дополнительный параметр устареет, когда mongo переключится на свой новый парсер URL.
Показать ещё 2 комментария
4

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

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

mongoose.connect(
    keys.getDbConnectionString(),
    { useNewUrlParser: true },
    err => {
        if (err) throw err;
        console.log('Successfully connected to database.');
    }
);
3
**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.");
});
  • 1
    Добавить описание
  • 0
    это получил для меня. Спасибо!
1

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

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

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

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

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

Я использовал 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 } 


      

Ещё вопросы

Сообщество Overcoder
Наверх
Меню