У меня есть класс оболочки базы данных, который устанавливает соединение с некоторым экземпляром 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"
Проверьте свою версию монго
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.
Как отмечалось, релиз версии 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
не будут "обновлены" по ожидаемой зависимости, пока вы действительно не захотите установить стабильную версию.
Ниже выделенного кода для подключения к mongoose было принято предупреждение для драйвера mongoose
mongoose.connect('mongodb://localhost:27017/CGtruCust', { useNewUrlParser: true });
Формат строки подключения должен быть mongodb://пользователь: пароль @хост: порт/дБ
например:
MongoClient.connect('mongodb://user:[email protected]:27017/yourDB', { useNewUrlParser: true } )
MongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } )
тоже работает.
Необходимо добавить { useNewUrlParser: true }
в метод mongoose.connect().
mongoose.connect('mongodb://localhost:27017/Notification',{ useNewUrlParser: true });
Ничего изменить, передать только в функции connect {useNewUrlParser: true }
это будет работать
MongoClient.connect(url,{ useNewUrlParser: true },function(err,db){
if(err){
console.log(err);
}
else {
console.log('connected to '+ url);
db.close();
}
})
Проблема может быть решена путем указания номера порта и использования этого анализатора {useNewUrlParser: true}. решение может быть:
mongoose.connect("mongodb://localhost:27017/cat_app", { useNewUrlParser: true });
Это решает мою проблему.
useNewUrlParser property
в connect
, но ваше решение помогло. так что проголосовал!
Я не думаю, что вам нужно добавить { useNewUrlParser: true }
.
Это зависит от вас, если вы хотите использовать новый синтаксический анализатор URL. В конце концов предупреждение исчезнет, когда mongo переключится на новый синтаксический анализатор URL.
Изменить: как указано здесь https://docs.mongodb.com/master/reference/connection-string/, вам не нужно устанавливать номер порта.
Достаточно добавить { useNewUrlParser: true }
.
useNewUrlParser: true
, предупреждение исчезнет. Но это немного глупо, так как этот дополнительный параметр устареет, когда mongo переключится на свой новый парсер URL.
Здесь, как у меня, подсказка не показывалась на моей консоли, пока я не обновил npm пару дней назад.
.connect имеет 3 параметра, URI, параметры и err.
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 db = await mongoose.createConnection(url, { useNewUrlParser: true });
mongoose.set('useCreateIndex', true);
mongoose.set('useFindAndModify', false);
Неверный демонстрационный код 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
}
Если 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));
Я использовал 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 }
beta
версии, которая так или иначе была выпущена на npm в течение выходных. Не беспокойтесь об этом, пока API фактически не будет завершен. Вы правильно сделали, установив стабильную версию.