Vermeiden Sie die Warnung "Der aktuelle URL-String-Parser ist veraltet", indem Sie useNewUrlParser auf true setzen

238

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:

(Knoten: 4833) DeprecationWarning: Der aktuelle URL-String-Parser 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 MongoClientOptionsInstanz als zweites Argument. Aber es hat keine Eigenschaft namens useNewUrlParser. Ich habe auch versucht, diese Eigenschaft in der Verbindungszeichenfolge wie folgt festzulegen: Dies mongodb://127.0.0.1/my-db?useNewUrlParser=truehat jedoch keine Auswirkungen auf diese Warnung.

Wie kann ich useNewUrlParserdiese Warnung entfernen? Dies ist für mich wichtig, da das Skript als Cron ausgeführt werden sollte und diese Warnungen zu Spam-Mail-Spam führen.

Ich verwende mongodbTreiber in Version 3.1.0-beta4mit entsprechendem @types/mongodbPaket in 3.0.18. Beide sind die neuesten verfügbaren npm install.

Problemumgehung

Verwenden einer älteren Version des Mongodb-Treibers:

"mongodb": "~3.0.8",
"@types/mongodb": "~3.0.18"
Löwe
quelle
5
Das kommt von der betaVersion, die am Wochenende irgendwie auf npm veröffentlicht wurde. Machen Sie sich keine Sorgen, bis die API tatsächlich fertiggestellt ist. Sie haben das Richtige getan, um eine stabile Version zu installieren.
Neil Lunn
1
über 3.0.0 von mongodb fügen Sie einfach mongoose.connect hinzu ("mongodb: // localhost: portnumber / YourDB", {useNewUrlParser: true})
Majedur Rahaman

Antworten:

401

Überprüfen Sie Ihre mongoVersion:

mongo --version

Wenn Sie Version> = 3.1.0 verwenden, ändern Sie Ihre mongoVerbindungsdatei in ->

MongoClient.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true })

oder Ihre Mungo-Verbindungsdatei zu ->

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

Im Idealfall handelt es sich um eine Funktion der Version 4, die jedoch auch von Version 3.1.0 und höher unterstützt wird. Weitere Informationen finden Sie in MongoDB GitHub .

Abhishek Sinha
quelle
1
@AbhishekSinha Warum mit Mongo> = 4.0.0? Ich benutze 3.6.5 und die nervige Nachricht ist auch weg.
Greuze
Yup hat das behoben. Grundsätzlich handelt es sich um eine v4-Funktion, aber v3.1.0 und höher unterstützt auch die neue Funktion.
Abhishek Sinha
3
Dies ist das Beste, wollte nur hinzufügen, wenn Sie einen Rückruf haben, insbesondere wegen eines Fehlers, verwenden Sie einfach Folgendes: mongoose.connect (dbUrl, {useNewUrlParser: true}, function (err) {console.log ("mongoDB linked", err);})
ptts
Danke,
behoben
46

Wie bereits erwähnt, wurde die 3.1.0-beta4Freigabe des Fahrers durch das Aussehen der Dinge etwas früher "in die Wildnis entlassen". Die Version ist Teil der laufenden Arbeiten, um neuere Funktionen in der kommenden 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 useNewUrlParserOption, da einige Änderungen an der tatsächlichen Übergabe des Verbindungs-URI vorgenommen wurden. Dazu später mehr.

Bis sich die Dinge "beruhigt" haben, wäre es wahrscheinlich ratsam, zumindest die Nebenversion für 3.0.xVeröffentlichungen zu "pinnen" :

  "dependencies": {
    "mongodb": "~3.0.8"
  }

Dadurch sollte verhindert werden, dass der 3.1.xZweig bei "Neuinstallationen" auf Knotenmodulen installiert wird. Wenn Sie bereits eine "neueste" Version installiert haben, bei der es sich um die "Beta" -Version handelt, sollten Sie Ihre Pakete bereinigen (undpackage-lock.json ) und sicherstellen, dass Sie diese auf eine 3.0.xSerienversion reduzieren.

Was die tatsächliche Verwendung der "neuen" Verbindungs-URI-Optionen betrifft, besteht die Haupteinschränkung darin, die portin der Verbindungszeichenfolge tatsächlich anzugeben:

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 mongodbRepository-Codes "Node-Native-Driver" (npm ) ist und der "neue Code" tatsächlich aus dem importiertmongodb-core Bibliothek den "öffentlichen" Knotentreiber "untermauert".

Der Sinn der hinzugefügten "Option" besteht darin, den Übergang zu "vereinfachen", indem die Option zu neuem Code hinzugefügt wird, damit der neuere Parser (tatsächlich basierend auf) url ) zum Hinzufügen der Option und zum Löschen der Verfallswarnung verwendet wird, um dies zu überprüfen Ihre übergebenen Verbindungszeichenfolgen entsprechen tatsächlich den Erwartungen des neuen Parsers.

In zukünftigen Versionen wird der "ältere" Parser entfernt, und dann wird der neue Parser einfach das sein, was auch ohne die Option verwendet wird. Zu diesem Zeitpunkt wird jedoch erwartet, dass der gesamte vorhandene Code ausreichend Gelegenheit hatte, die vorhandenen Verbindungszeichenfolgen anhand der Erwartungen des neuen Parsers zu testen.

Wenn Sie also neue Treiberfunktionen verwenden möchten, sobald diese veröffentlicht werden, verwenden Sie die verfügbaren betaund nachfolgenden Versionen und stellen Sie im Idealfall sicher, dass Sie eine Verbindungszeichenfolge bereitstellen, die für den neuen Parser gültig ist, indem Sie die useNewUrlParserOption in aktivieren MongoClient.connect().

Wenn Sie keinen Zugriff auf Funktionen benötigen, die sich auf die Vorschau der MongoDB 4.0-Version beziehen, können Sie die Version wie bereits erwähnt an eine 3.0.xSerie anheften. Dies funktioniert wie dokumentiert und durch "Anheften" wird sichergestellt, dass 3.1.xReleases nicht über die erwartete Abhängigkeit "aktualisiert" werden, bis Sie tatsächlich eine stabile Version installieren möchten.

Neil Lunn
quelle
1
Haben Sie weitere Informationen darüber, was Sie meinen, wenn Sie "in die Wildnis entlassen" sagen? Wie ist 3.1.0-beta4 aus dem Zoo entkommen? Können Sie dazu irgendwelche Referenzen zitieren?
Wyck
2
@Wyck Die "Referenz" war natürlich, dass zu dem Zeitpunkt, als die Frage gestellt wurde, npm install mongodbdie "Beta" (deutlich in der in der Frage gezeigten Versionszeichenfolge markiert) installiert wurde, da sie zu diesem Zeitpunkt als stableim npm-Repository markiert war hätte nicht sein sollen. Dies war zu diesem Zeitpunkt in der Tat ein Fehler und sollte immer berücksichtigt werden, wenn eine Code-Version, die alphaoder betainnerhalb der Versionszeichenfolge angezeigt wird, ähnlich als stabil markiert ist. Natürlich ist die Zeit vergangen und dies ist jetzt eine Funktion in stabilen Releases, bis sie (wie erwähnt) irgendwann verschwindet.
Neil Lunn
45

Der unten hervorgehobene Code für die Mungo-Verbindung löste die Warnung für den Mungotreiber:

mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
Narendra Maru
quelle
4
Ich arbeite nicht für mich. wird immer noch angezeigt: (Knoten: 35556) DeprecationWarning: Der aktuelle URL-String-Parser 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.
Alex
Sie müssen server.js oder app.js überall dort speichern, wo Sie den DB-Pfad angeben, wenn dies immer noch nicht funktioniert. Versuchen Sie, node_modules zu löschen und neu zu installieren, indem Sie npm install eingeben, wann immer Ihre package.json-Datei lautet
Narendra Maru
24

Es gibt nichts zu ändern. Übergeben Sie nur die 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();
    }
})
AAshish jha
quelle
Genau das, was ich brauchte, aber die Warnmeldung ist immer noch da: -S
alex351
Funktioniert für mich, keine Warnungen mehr.
Q. Qiao
17

Sie müssen { useNewUrlParser: true }die Methode mongoose.connect () hinzufügen .

mongoose.connect('mongodb://localhost:27017/Notification',{ useNewUrlParser: true });
KARTHIKEYAN.A
quelle
1
Diese Antwort ist die gleiche wie andere Antworten, die Monate zuvor veröffentlicht wurden
Daniel W.
Wie unterscheidet sich das von früheren Antworten?
Peter Mortensen
@PeterMortensen Bitte überprüfen Sie das Datum, an dem die Antwort zuerst veröffentlicht wurde
KARTHIKEYAN.A
15

Das Verbindungszeichenfolgenformat muss mongodb: // user: password @ host: port / db sein

Beispielsweise:

MongoClient.connect('mongodb://user:[email protected]:27017/yourDB', { useNewUrlParser: true } )
Boris Traljić
quelle
Funktioniert MongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } )auch.
Nino Filiu
Wie unterscheidet sich das von früheren Antworten?
Peter Mortensen
15

Sie müssen lediglich die folgenden Einstellungen vornehmen, bevor Sie eine Verbindung zur Datenbank herstellen:

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');

Ebenfalls,

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().
SJ
quelle
3
Sollte die beste Antwort sein. Alle anderen Antworten für mich sind kläglich gescheitert.
Anthony
Bitte markieren Sie die Ans, als correctob es für Sie funktioniert hat. Es hat auch bei mir funktioniert!
Arpan Banerjee
9

Folgendes funktioniert für mich

const mongoose = require('mongoose');

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

Die mongooseVersion ist 5.8.10.

Techguru
quelle
1
Dieser hat auch für mich funktioniert. Ich benutze ...body-parser": "^1.19.0", "express": "^4.17.1", "mongoose": "^5.9.14"
Arpan Banerjee
8

Ich glaube nicht, dass Sie hinzufügen müssen { useNewUrlParser: true } .

Es liegt an Ihnen, ob Sie den neuen URL-Parser bereits verwenden möchten. Schließlich verschwindet die Warnung, wenn MongoDB zu ihrem neuen URL-Parser wechselt.

Wie im URI-Format der Verbindungszeichenfolge angegeben , müssen Sie die Portnummer nicht festlegen.

Nur hinzufügen { useNewUrlParser: true }ist genug.

Sam
quelle
1
Ich habe die Portnummer hinzugefügt und erhalte immer noch die Fehlermeldung. Ich finde die Fehlermeldung sehr verwirrend und irreführend: Warum erhalte ich eine Meldung, dass ich das neue Format verwenden soll, obwohl ich das alte Format verwende und es perfekt funktioniert ... !! ??
Nico
2
Gute Frage! Beachten Sie, dass es sich um eine Warnung handelt. Kein Fehler. Nur durch Hinzufügen useNewUrlParser: truewird die Warnung ausgeblendet. Aber das ist ein bisschen dumm, da dieser zusätzliche Parameter veraltet sein wird, sobald Mongo zu seinem neuen URL-Parser wechselt.
Sam
Woher wussten Sie, dass die Portnummer den Erwartungen des neuen URL-Parsers entspricht? Ich kann nichts finden, das tatsächlich beschreibt, was der neue URL-Parser ist
Brad
@Brad, in der Tat. Ich ging davon aus, dass Sie die Portnummer hinzufügen müssen, aber die Mongo-Spezifikationen erwähnen die Portnummer immer noch als optional. Ich habe meine Antwort entsprechend aktualisiert.
Sam
8

Aktualisiert für ECMAScript 8 / warten

Der falsche ECMAScript 8-Demo-Code, den MongoDB inc bereitstellt, erstellt ebenfalls diese Warnung.

MongoDB bietet die folgenden Ratschläge, die falsch sind

Um den neuen Parser zu verwenden, übergeben Sie die Option {useNewUrlParser: true} an MongoClient.connect.

Dies führt zu folgendem Fehler:

TypeError: Das letzte Argument für executeOperationmuss ein Rückruf sein

Stattdessen muss die Option bereitgestellt werden, umnew MongoClient :

Siehe den folgenden Code:

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
}
Mikemaccana
quelle
7

Das Problem kann gelöst werden, indem Sie die Portnummer angeben und diesen Parser verwenden: {useNewUrlParser: true}

Die Lösung kann sein:

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

Es löst mein Problem.

Mehedi Abdullah
quelle
3
Konsole selbst gab Lösung hinzuzufügen , useNewUrlParser propertyin connect, aber Ihre Lösung geholfen. so Upvoted!
Ganeshdeshmukh
7

Das vollständige Beispiel für Express.js, API-Aufruffälle und das Senden von JSON-Inhalten 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()
          },
        )
    })
}
römisch
quelle
4

So habe ich es. Der Hinweis wurde erst auf meiner Konsole angezeigt, als ich npm einige Tage zuvor aktualisiert hatte.

.connect hat drei Parameter: URI, Optionen und Fehler.

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

Wir haben verwendet:

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

→ Dies führt zu einem URL-Parser-Fehler

Die richtige Syntax lautet:

mongoose.connect("mongodb://localhost:27017/mean-course" , { useNewUrlParser: true }).then(
  (res) => {
   console.log("Connected to Database Successfully.")
  }
).catch(() => {
  console.log("Connection to database failed.");
});
BASANT KUMAR
quelle
1
Fügen Sie eine Beschreibung hinzu
Mathews Sunny
4

Sie müssen nur hinzufügen

{ useNewUrlParser: true }

innerhalb der Methode mongoose.connect.

AGrush
quelle
1
Wie unterscheidet sich das von früheren Antworten?
Peter Mortensen
Überprüfen Sie den Hash.
AGrush
2

Die folgenden Arbeiten für mich für die Version 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))
Lalit Tyagi
quelle
1

Diese Zeilen haben den Trick auch für alle anderen Verfallswarnungen ausgeführt:

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

Ich habe mlab.com als MongoDB-Datenbank verwendet. Ich habe die Verbindungszeichenfolge in einen anderen Ordner mit dem Namen configund in der Datei keys.js getrennt. Die Verbindungszeichenfolge wurde beibehalten:

module.exports = {
  mongoURI: "mongodb://username:[email protected]:47267/projectname"
};

Und der Servercode war

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

Sie müssen {useNewUrlParser: true} nach der Verbindungszeichenfolge schreiben, wie ich es oben getan habe.

Einfach ausgedrückt, müssen Sie Folgendes tun:

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

Zibon
quelle
1

Ich verwende Mungo Version 5.x für mein Projekt. Nachdem Sie das Mungopaket benötigt haben, stellen Sie den Wert global wie folgt ein.

const mongoose = require('mongoose');

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

Wenn usernameoder passwordhat der @Charakter, dann verwenden Sie es wie folgt:

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));
Saahithyan Vigneswaran
quelle