it-swarm.com.de

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

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.

Workaround

Verwenden einer älteren Version des Mongodb-Treibers:

"mongodb": "~3.0.8", "@types/mongodb": "~3.0.18"

133
Lion

Ü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.

277
Abhishek Sinha

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.

38
Neil Lunn

Die unten hervorgehobene Code-zu-Moose-Verbindung löste die Warnung für den Moose-Treiber

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

Das Format der Verbindungszeichenfolge muss mongodb: // Benutzer: Kennwort @ Host: Port/db sein. 

z.B:

MongoClient.connect('mongodb://user:[email protected]:27017/yourDB', { useNewUrlParser: true } )
15
Boris Traljić

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

mongoose.connect('mongodb://localhost:27017/Notification',{ useNewUrlParser: true });
14
KARTHIKEYAN.A

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();
  }
})
13
AAshish jha

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.

7
Mehedi Abdullah

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.

6
Sam

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.`);
    }
);
4
Hashasaur
**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.");
});
3
BASANT KUMAR

sie müssen nur hinzufügen

{useNewUrlParser: true}

innerhalb der mongoose.connect-Methode

2
JakeS

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()
        },
      )
  })
}
2
Roman

Für ES8 aktualisiert/warten

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
}
2
mikemaccana

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);
0
fedu

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 } 


      

0
zibon