Избегайте предупреждения "Текущий анализатор строк 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"
23 ответа
Проверьте свою версию Монго
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 для деталей.
Как отметил 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
релизы не "обновляются" в зависимости от ожидаемой зависимости, пока вы не захотите установить стабильную версию.
Ниже выделенный код для подключения мангуста решено предупреждение для водителя мангуста
mongoose.connect('mongodb://localhost:27017/CGtruCust', { useNewUrlParser: true });
Ничего не менять, передать только в функцию подключения {useNewUrlParser: true }
это будет работать
MongoClient.connect(url,{ useNewUrlParser: true },function(err,db){
if(err){
console.log(err);
}
else {
console.log('connected to '+ url);
db.close();
}
})
Вам просто нужно настроить следующие параметры перед подключением к базе данных, как показано ниже:
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().
Нужно добавить { useNewUrlParser: true }
в методе mongoose.connect().
mongoose.connect('mongodb://localhost:27017/Notification',{ useNewUrlParser: true });
Формат строки подключения должен быть mongodb://usr:pwd@host:port/db
например:
MongoClient.connect('mongodb://user:password@127.0.0.1:27017/yourDB', { useNewUrlParser: true } )
Следующие работы для меня
const mongoose = require('mongoose');
mongoose.connect("mongodb://localhost/playground", { useNewUrlParser: true,useUnifiedTopology: true })
.then(res => console.log('Connected to db'));
В mongoose
версия 5.8.10
.
Проблема может быть решена путем указания номера порта и использования этого синтаксического анализатора { useNewUrlParser: true } . решение может быть:
mongoose.connect("mongodb://localhost:27017/cat_app", { useNewUrlParser: true });
Это решает мою проблему.
Я не думаю, что вам нужно добавлять { useNewUrlParser: true }
,
Вам решать, хотите ли вы уже использовать новый анализатор URL. В конце концов, предупреждение исчезнет, когда Монго переключится на свой новый парсер URL.
Изменить: как указано здесь https://docs.mongodb.com/master/reference/connection-string/ вам не нужно устанавливать номер порта.
Просто добавив { useNewUrlParser: true }
достаточно.
Обновлен для 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
}
Следующая работа для меня для mongoose
версия 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))
Ниже приведен полный пример для ExpressJS, случая вызова 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()
},
)
})
}
Вам просто нужно добавить
{ useNewUrlParser: true }
внутри метода mongoose.connect
Вот как у меня получилось, подсказка не отображалась на моей консоли, пока я не обновил npm пару дней назад.
.connect имеет 3 параметра, URI, параметры и ошибку.
mongoose.connect(
keys.getDbConnectionString(),
{ useNewUrlParser: true },
err => {
if (err) throw err;
console.log(`Successfully connected to database.`);
}
);
**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.");
});
const mongoose = require('mongoose');
mongoose
.connect(connection_string, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false,
})
.then((con) => {
console.log("connected to db");
});
попробуйте использовать это
Я использовал mlab.com в качестве базы данных Монго. Я разделил строку подключения на другую папку с именем 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();
//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 }
Эти строки сделали свое дело для всех других предупреждений об устаревании:
const db = await mongoose.createConnection(url, { useNewUrlParser: true });
mongoose.set('useCreateIndex', true);
mongoose.set('useFindAndModify', false);
У меня это прекрасно работает:
mongoose.set("useNewUrlParser", true);
mongoose.set("useUnifiedTopology", true);
mongoose
.connect(db) //Connection string defined in another file
.then(() => console.log("Mongo Connected..."))
.catch(() => console.log(err));
Я использую для своего проекта mongoose версии 5.x. После запроса пакета mongoose установите глобальное значение, как показано ниже.
const mongoose = require('mongoose');
// Set the global useNewUrlParser option to turn on useNewUrlParser for every connection by default.
mongoose.set('useNewUrlParser', true);
(узел:16596) DeprecationWarning: текущий синтаксический анализатор строки URL устарел и будет удален в будущей версии. Чтобы использовать новый синтаксический анализатор, передайте параметр {useNewUrlParser: true} в MongoClient.connect. (Использовать
чтобы показать, где было создано предупреждение) (узел:16596) [ДРАЙВЕР MONGODB] Предупреждение. Текущий механизм обнаружения и мониторинга сервера устарел и будет удален в будущей версии. Чтобы использовать новый механизм обнаружения и мониторинга сервера, передайте параметр {useUnifiedTopology: true} конструктору MongoClient.
Применение:
async connect(connectionString: string): Promise<void> {
this.client = await MongoClient.connect(connectionString, {
useUnifiedTopology: true,
useNewUrlParser: true,
})
this.db = this.client.db()
}
Если 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));