Ich habe eine Datenbank-Wrapper-Klasse, die eine Verbindung zu einer MongoDB-Instanz herstellt:
async connect(connectionString: string): Promise<void> {
this.client = await MongoClient.connect(connectionString)
this.db = this.client.db()
}
Dies gab mir eine Warnung:
(node: 4833) DeprecationWarning: Der aktuelle Parser für URL-Zeichenfolgen ist veraltet und wird in einer zukünftigen Version entfernt. Um den neuen Parser zu verwenden, übergeben Sie die Option {useNewUrlParser: true} an MongoClient.connect.
Die connect()
-Methode akzeptiert eine MongoClientOptions
-Instanz als zweites Argument. Es hat jedoch keine Eigenschaft namens useNewUrlParser
. Ich habe auch versucht, diese Eigenschaft in der Verbindungszeichenfolge wie folgt festzulegen: mongodb://127.0.0.1/my-db?useNewUrlParser=true
, aber diese Warnung wirkt sich nicht auf diese Warnung aus.
Wie kann ich also useNewUrlParser
so einstellen, dass diese Warnung entfernt wird? Dies ist für mich wichtig, da das Skript als cron ausgeführt werden sollte und diese Warnungen zu Spam-Mails führen.
Ich verwende mongodb
Treiber in Version 3.1.0-beta4
mit dem entsprechenden @types/mongodb
-Paket in 3.0.18
. Beide sind die aktuellsten, die npm install
verwenden.
Verwenden einer älteren Version des Mongodb-Treibers:
"mongodb": "~3.0.8",
"@types/mongodb": "~3.0.18"
Überprüfen Sie Ihre Mongo-Version
mongo --version
Wenn Sie Version> = 3.1.0 verwenden, ändern Sie Ihre Mongo-Verbindungsdatei in ->
MongoClient.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true })
oder deine mongoose-Verbindungsdatei an ->
mongoose.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true });
Idealerweise handelt es sich um eine Version 4-Funktion, jedoch wird sie auch von Version 3.1.0 und höher unterstützt. Check out MongoDB Github für Details.
Wie bereits erwähnt, wurde das 3.1.0-beta4
-Release des Treibers durch das Aussehen der Dinge etwas zu früh "in die Wildnis entlassen". Die Version ist Teil der laufenden Arbeit, um neuere Funktionen der anstehenden Version von MongoDB 4.0 zu unterstützen und einige andere API-Änderungen vorzunehmen.
Eine solche Änderung, die die aktuelle Warnung auslöst, ist die Option useNewUrlParser
aufgrund einiger Änderungen in Bezug darauf, wie die Verbindungs-URI tatsächlich funktioniert. Dazu später mehr.
Bis sich die Dinge "beruhigt" haben, ist es wahrscheinlich ratsam, zumindest an die untergeordnete Version für 3.0.x
Releases "anzuheften":
"dependencies": {
"mongodb": "~3.0.8"
}
Dies sollte die Installation des 3.1.x
-Zweigs bei "neuen" Installationen auf Knotenmodulen verhindern. Wenn Sie bereits eine "neueste" Version installiert haben, die "Beta" -Version, sollten Sie Ihre Pakete (und package-lock.json
) bereinigen und sicherstellen, dass Sie die Serienversion 3.0.x
herunterladen.
Bei der Verwendung der "neuen" Verbindungs-URI-Optionen besteht die Haupteinschränkung darin, tatsächlich die Variable port
in die Verbindungszeichenfolge aufzunehmen:
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)
}
})()
Das ist eine strengere Regel im neuen Code. Der Hauptpunkt ist, dass der aktuelle Code im Wesentlichen Teil des Repository-Codes "node-native-driver" (npm mongodb
) ist und der "neue Code" tatsächlich aus der mongodb-core
-Bibliothek importiert, die "zugrunde liegt" "der" öffentliche "Knotentreiber.
Der Punkt der hinzugefügten "Option" besteht darin, den Übergang zu "erleichtern", indem die Option zu neuem Code hinzugefügt wird, so dass der neuere Parser (der eigentlich auf url
basiert) im Code verwendet wird, indem er die Option hinzufügt und die Warnung über die Zurückweisung aufhebt und damit überprüfen, ob Ihre übergebenen Verbindungszeichenfolgen tatsächlich dem entsprechen, was der neue Parser erwartet.
In zukünftigen Releases würde der Parser "Legacy" entfernt und der neue Parser wird dann auch ohne die Option verwendet. Zu diesem Zeitpunkt wird jedoch erwartet, dass der gesamte vorhandene Code ausreichend Gelegenheit hatte, die vorhandenen Verbindungszeichenfolgen mit den Erwartungen des neuen Parsers zu testen.
Wenn Sie also neue Treiberfunktionen verwenden möchten, verwenden Sie die verfügbare Variable beta
und nachfolgende Versionen. Stellen Sie im Idealfall sicher, dass Sie eine Verbindungszeichenfolge bereitstellen, die für den neuen Parser gültig ist, indem Sie die Option useNewUrlParser
in MongoClient.connect()
aktivieren.
Wenn Sie nicht wirklich auf Funktionen für die Vorschau der MongoDB 4.0-Version zugreifen müssen, fixieren Sie die Version wie oben erwähnt mit einer 3.0.x
-Serie. Dies funktioniert wie dokumentiert und "Pinning". Dies stellt sicher, dass 3.1.x
Releases nicht über die erwartete Abhängigkeit "aktualisiert" werden, bis Sie tatsächlich eine stabile Version installieren möchten.
Die unten hervorgehobene Code-zu-Moose-Verbindung löste die Warnung für den Moose-Treiber
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
Das Format der Verbindungszeichenfolge muss mongodb: // Benutzer: Kennwort @ Host: Port/db sein.
z.B:
MongoClient.connect('mongodb://user:[email protected]:27017/yourDB', { useNewUrlParser: true } )
Sie müssen{ useNewUrlParser: true }
in der mongoose.connect () - Methode hinzufügen.
mongoose.connect('mongodb://localhost:27017/Notification',{ useNewUrlParser: true });
Nichts zu ändern, übergeben Sie nur in der Verbindungsfunktion {useNewUrlParser: true }
das wird funktionieren
MongoClient.connect(url,{ useNewUrlParser: true },function(err,db){
if(err){
console.log(err);
}
else {
console.log('connected to '+ url);
db.close();
}
})
Das Problem kann durch Angabe der Portnummer und Verwendung dieses Parsers gelöst werden.
mongoose.connect("mongodb://localhost:27017/cat_app", { useNewUrlParser: true });
Es löst mein Problem.
Ich denke nicht, dass Sie { useNewUrlParser: true }
hinzufügen müssen.
Es liegt an Ihnen, ob Sie den neuen URL-Parser bereits verwenden möchten. Eventuell verschwindet die Warnung, wenn der Mongo zu seinem neuen URL-Parser wechselt.
Edit: Wie hier angegeben https://docs.mongodb.com/master/reference/connection-string/ müssen Sie die Portnummer nicht festlegen.
Das Hinzufügen von { useNewUrlParser: true }
reicht aus.
Ich habe es so: Der Hinweis wurde auf meiner Konsole nicht angezeigt, bis ich npm einige Tage zuvor aktualisiert habe.
.connect verfügt über 3 Parameter, den URI, die Optionen und den Fehler.
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.");
});
sie müssen nur hinzufügen
{useNewUrlParser: true}
innerhalb der mongoose.connect-Methode
Das vollständige Beispiel für ExpressJS, API-Calling-Case und JSON-Sendung lautet wie folgt:
...
app.get('/api/myApi', (req, res) => {
MongoClient.connect('mongodb://user:[email protected]: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()
},
)
})
}
Der falsche ES8-Demo-Code, den MongoDB Inc. bereitstellt erstellt ebenfalls diese Warnung.
MongoDB liefert die folgenden Ratschläge, die falsch sind
Um den neuen Parser zu verwenden, übergeben Sie die Option {useNewUrlParser: true} an MongoClient.connect.
Dadurch wird der folgende Fehler verursacht:
TypeError: Das letzte Argument für
executeOperation
muss ein Rückruf sein
Stattdessen muss die Option für new MongoClient
angegeben werden:
Siehe den Code unten:
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
}
Diese Zeilen haben auch den Trick für alle anderen Abwertungswarnungen übernommen:
const db = await mongoose.createConnection(url, { useNewUrlParser: true });
mongoose.set('useCreateIndex', true);
mongoose.set('useFindAndModify', false);
Wenn username
oder password
@
-Zeichen hat. Dann verwenden Sie so
mongoose
.connect(
'DB_url',
{ user: '@dmin', pass: '[email protected]', useNewUrlParser: true }
)
.then(() => console.log('Connected to MongoDB'))
.catch(err => console.log('Could not connect to MongoDB', err));
Ich habe mlab.com als Mongo-Datenbank verwendet. Ich trennte die Verbindungszeichenfolge in einen anderen Ordner namens config und in keys.js. Ich behielt die Verbindungszeichenfolge bei
module.exports = {
mongoURI: "mongodb://username:[email protected]:47267/projectname"
};
und der Servercode war
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
sie müssen {useNewUrlParser: true} wie oben beschrieben nach der Verbindungszeichenfolge schreiben.
einfach ausgedrückt: Sie müssen Folgendes tun:
mongoose.connect(connectionString,{ useNewUrlParser: true }
//or
MongoClient.connect(connectionString,{ useNewUrlParser: true }