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


239

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

5
Это происходит от betaверсии, которая как-то вышла на npm в выходные. Не беспокойтесь об этом, пока API фактически не будет завершен. Вы правильно сделали, установив стабильную версию.
Нил Ланн

1
выше 3.0.0 mongodb добавьте просто mongoose.connect ("mongodb: // localhost: portnumber / YourDB", {useNewUrlParser: true})
Маджедур Рахаман,

Ответы:


402

Проверьте свою mongoверсию:

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 для деталей.


1
@AbhishekSinha Почему с Монго> = 4.0.0? Я использую 3.6.5, и раздражающее сообщение ушло тоже.
Груз

Да, это исправлено. По сути, это функция v4, но версия 3.1.0 и выше также поддерживает новую функцию.
Абхишек Синха

3
Это лучшее, что я просто хотел добавить, если у вас есть обратный вызов, особенно для ошибки, просто используйте это: mongoose.connect (dbUrl, {useNewUrlParser: true}, function (err) {console.log ("mongoDB connected", err);})
ptts

Спасибо, Исправлено как про
Хидайт Рахман

46

Как отмечалось, 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)
  }

})()

Это более «строгое» правило в новом коде. Суть в том, что текущий код по сути является частью mongodbкода репозитория «node-native-driver» (npm ), а «новый код» фактически импортирует из mongodb-coreбиблиотеки, которая «поддерживает» «публичный» драйвер узла.

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

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

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

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


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

2
@Wyck «Ссылка» была, конечно, в момент, когда был задан вопрос, в npm install mongodbрезультате чего была установлена «бета» (четко обозначенная в строке версии, показанной в вопросе), поскольку она была помечена как stableв репозитории npm, когда она не должно было быть. В то время это действительно было ошибкой, и ее всегда следует учитывать, если какой-либо выпуск кода, показывающий alphaили betaнаходящийся в строке версии, аналогичным образом помечается как стабильный. Естественно, прошло время, и сейчас это функция стабильных выпусков, пока (как уже отмечалось) она в конечном итоге не исчезнет.
Нил Ланн

45

Приведенный ниже код для подключения к mongoose устраняет предупреждение для драйвера mongoose:

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

4
не работает для меня. все еще получает: (узел: 35556) DeprecationWarning: текущий анализатор строки URL устарел и будет удален в следующей версии. Чтобы использовать новый анализатор, передайте параметр {useNewUrlParser: true} в MongoClient.connect.
Алекс

Вам нужно сохранить server.js или app.js, куда бы вы ни указали путь к БД, если он все еще не работает, попробуйте удалить и переустановить node_modules, введя npm install, если ваш файл package.json
Narendra Maru

24

Здесь нечего менять. Пройдите только в функции подключения {useNewUrlParser: true }.

Это будет работать:

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

Как раз то, что мне было нужно, но предупреждающее сообщение все еще там: -S
alex351

У меня работает, предупреждений больше нет.
Q. Qiao

17

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

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

1
этот ответ такой же, как и другие ответы, которые были опубликованы несколькими месяцами ранее
Даниэль В.

Чем это отличается от предыдущих ответов?
Питер Мортенсен

@PeterMortensen, пожалуйста, проверьте дату, кто первым опубликовал ответ
KARTHIKEYAN.A

15

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

Например:

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

MongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } )тоже работает.
Нино Филиу

Чем это отличается от предыдущих ответов?
Питер Мортенсен

15

Вам просто нужно установить следующие вещи перед подключением к базе данных, как показано ниже:

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

3
Должен быть главный ответ. Все остальные ответы для меня с треском провалились.
Энтони

Просьба отметить ответ, как correctбудто это сработало для вас. Это сработало и для меня!
Арпан Банерджи

9

Следующее работает для меня

const mongoose = require('mongoose');

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

mongooseВерсия 5.8.10.


1
Этот тоже работал на меня. Я использую ...body-parser": "^1.19.0", "express": "^4.17.1", "mongoose": "^5.9.14"
Арпан Банерджи

8

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

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

Как указано в формате URI строки подключения , вам не нужно устанавливать номер порта.

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


1
Я добавил номер порта и все еще получаю сообщение об ошибке. Я нахожу сообщение об ошибке очень запутанным и вводящим в заблуждение: почему я получаю сообщение о том, что мне нужно использовать новый формат, когда на самом деле я использую старый формат, и он работает отлично ... !! ??
Нико

2
Хороший вопрос! Обратите внимание, что это предупреждение. Не ошибка Только после добавления useNewUrlParser: trueпредупреждение исчезнет. Но это немного глупо, так как этот дополнительный параметр устареет, когда mongo переключится на свой новый парсер URL.
Сэм

как вы узнали, что номер порта - это то, что ожидает новый парсер URL? Я не могу найти ничего, что на самом деле описывает, что новый парсер URL
Брэд

@ Брэд, действительно. Я предполагал, что вам нужно добавить номер порта, но спецификации Mongo все еще упоминают номер порта как дополнительный. Я обновил свой ответ соответственно.
Сэм

8

Обновлено для ECMAScript 8 / ожидание

Неправильный демонстрационный код ECMAScript 8, предоставляемый 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
}

7

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

Решение может быть:

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

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


3
Сама консоль дала решение , чтобы добавить useNewUrlParser propertyв connect, но ваше решение помогло. так что проголосовал!
Ганешдешмукх

7

Полный пример для Express.js, случая вызова 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()
          },
        )
    })
}

4

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

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

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

4

Мы использовали:

mongoose.connect("mongodb://localhost/mean-course").then(
  (res) => {
   console.log("Connected to Database Successfully.")
  }
).catch(() => {
  console.log("Connection to database failed.");
});

→ Это приводит к ошибке парсера URL

Правильный синтаксис:

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

1
Добавить описание
Mathews Sunny


2

Следующая работа у меня для версии 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))

1

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

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

1

Я использовал mlab.com в качестве базы данных MongoDB. Я разделил строку подключения к другой папке с именем 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();

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

// Connect to MongoDB

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

Вам нужно написать {useNewUrlParser: true} после строки подключения, как я делал выше.

Проще говоря, вам нужно сделать:

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


1

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

const mongoose = require('mongoose');

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

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));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.