Уникайте попередження "поточний аналізатор рядків рядків URL", встановивши для параметра useNewUrlParser значення true


239

У мене є клас обгортки бази даних, який встановлює з'єднання з деяким екземпляром MongoDB:

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

Це дало мені попередження:

(вузол: 4833) DeprecationWarning: поточний аналізатор рядків рядків застарілий і буде видалений у наступній версії. Щоб використовувати новий аналізатор, перейдіть за допомогою параметра {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})
Majedur Rahaman

Відповіді:


402

Перевірте свою 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
@AbhishekSinha Чому з mongo> = 4.0.0? Я використовую 3.6.5, і дратує повідомлення теж пішло.
мазі

Так виправили. В основному, це функція v4, але v3.1.0 і вище підтримує нову функцію.
Абхішек Сінга

3
Це найкраще, просто хотів додати, якщо у вас є зворотний дзвінок, esp для помилки, просто використовуйте це: mongoose.connect (dbUrl, {useNewUrlParser: true}, function (помилка) {console.log ("mongoDB підключено",
помилка

Дякую, виправлено на зразок pro
Hidayt Rahman

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бібліотеки, що "підкреслює" драйвер "public".

Суть доданої "опції" полягає в "полегшенні" переходу шляхом додавання опції до нового коду, так що новіший аналізатор (фактично заснований навколо url) використовується в коді, додаючи параметр і очищаючи попередження про депресію, а тому перевіряючи, що передані вами рядки з'єднання фактично відповідають тому, що очікує новий аналізатор.

У майбутніх випусках «застарілий» аналізатор буде видалений, і тоді новий аналізатор буде просто тим, що використовується навіть без опції. Але до того часу, як очікується, всі існуючі коди мали достатньо можливостей перевірити свої існуючі рядки з'єднання на те, що очікує новий аналізатор.

Отже, якщо ви хочете почати використовувати нові функції драйвера після їх випуску, тоді використовуйте доступні betaта наступні версії та в ідеалі переконайтесь, що ви надаєте рядок з'єднання, що є дійсною для нового аналізатора, включивши useNewUrlParserопцію в MongoClient.connect().

Якщо вам насправді не потрібен доступ до функцій, пов’язаних із попереднім переглядом випуску MongoDB 4.0, прикріпіть версію до 3.0.xсерії, як було зазначено раніше. Це спрацює як задокументовано, і "прикріплення" це гарантує, що 3.1.xвипуски не "оновлюються" над очікуваною залежністю, поки ви фактично не захочете встановити стабільну версію.


1
Чи маєте ви більше інформації про те, що ви маєте на увазі, коли говорите "випущено в дику природу"? Як 3.1.0-beta4 втік із зоопарку? Ви можете навести якісь відповіді з цього приводу?
Wyck

2
@Wyck "Посилання", звичайно, було те, що на момент запитання це робило, в npm install mongodbрезультаті чого "бета" (чітко позначена у рядку версії, показана в запитанні) встановлюється, оскільки вона була позначена як stableу сховищі npm, коли вона не повинен був бути. Це справді була помилка в той час, і її завжди слід враховувати, якщо будь-який випуск коду, що відображається alphaабо betaв рядку версії, аналогічно позначається як стабільний. Природно, що минув час, і це особливість у стабільних випусках зараз, поки (як зазначалося) він з часом не піде.
Ніл

45

Нижче виділений код до з'єднання мангуста вирішив попередження для драйвера мангуста:

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

4
не працює для мене. все ще отримує: (вузол: 35556) DeprecationWarning: поточний аналізатор рядків рядків застарілий і буде видалений у наступній версії. Щоб використовувати новий аналізатор, перейдіть за допомогою параметра {useNewUrlParser: true} до MongoClient.connect.
Олексій

Вам потрібно зберегти server.js або app.js там, де ви даєте шлях до DB, якщо все ще не працює, спробуйте видалити та перевстановити 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
ця відповідь така ж, як і інші відповіді, які були опубліковані місяцями раніше
Daniel W.

Чим це відрізняється від попередніх відповідей?
Пітер Мортенсен

@PeterMortensen, будь ласка, перевірте дату, хто першим опублікував відповідь
KARTHIKEYAN.A

15

Формат рядка з'єднання повинен бути mongodb: // user: password @ host: port / db

Наприклад:

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 String Connection , вам не потрібно встановлювати номер порту.

Досить лише додати { useNewUrlParser: true }.


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

2
Гарне питання! Зауважте, що це попередження. Не помилка. Лише додавши useNewUrlParser: true, попередження зникне. Але це трохи нерозумно, оскільки цей додатковий параметр стане застарілим, як тільки монго перейде на новий URL-аналізатор URL-адреси.
Сем

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

@Brad, справді. Я припускав, що вам потрібно додати номер порту, але в специфікаціях 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

4

Вам просто потрібно додати

{ useNewUrlParser: true }

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


1
Чим це відрізняється від попередніх відповідей?
Пітер Мортенсен

перевірити хеш.
AGrush

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

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

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.