Evita l'avvertenza "l'attuale parser di stringhe URL è deprecato" impostando useNewUrlParser su true


239

Ho una classe wrapper di database che stabilisce una connessione ad alcune istanze MongoDB:

async connect(connectionString: string): Promise<void> {
        this.client = await MongoClient.connect(connectionString)
        this.db = this.client.db()
}

Questo mi ha dato un avvertimento:

(nodo: 4833) DeprecationWarning: il parser della stringa URL corrente è obsoleto e verrà rimosso in una versione futura. Per utilizzare il nuovo parser, passare l'opzione {useNewUrlParser: true} a MongoClient.connect.

Il connect()metodo accetta MongoClientOptionsun'istanza come secondo argomento. Ma non ha una proprietà chiamata useNewUrlParser. Ho anche provato a impostare tali proprietà nella stringa di connessione in questo modo: mongodb://127.0.0.1/my-db?useNewUrlParser=truema non ha alcun effetto su tali avvisi.

Quindi, come posso impostare useNewUrlParserper rimuovere tali avvisi? Questo è importante per me dal momento che lo script dovrebbe essere eseguito come cron e tali avvisi comportano lo spam nella spazzatura.

Sto usando il mongodbdriver nella versione 3.1.0-beta4con il @types/mongodbpacchetto corrispondente in 3.0.18. Entrambi sono gli ultimi disponibili disponibili npm install.

Soluzione

Utilizzando una versione precedente del driver mongodb:

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

5
betaViene dalla versione che in qualche modo è stata rilasciata su npm durante il fine settimana. Non preoccuparti fino a quando l'API non è stata finalizzata. Hai fatto la cosa giusta installando una versione stabile.
Neil Lunn,

1
sopra 3.0.0 di mongodb aggiungi semplicemente mongoose.connect ("mongodb: // localhost: portnumber / YourDB", {useNewUrlParser: true})
Majedur Rahaman,

Risposte:


402

Controlla la tua mongoversione:

mongo --version

Se si utilizza la versione> = 3.1.0, modificare il mongofile di connessione in ->

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

o il tuo file di connessione mongoose a ->

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

Idealmente, è una funzionalità della versione 4, ma v3.1.0 e successive la supportano anche. Dai un'occhiata a MongoDB GitHub per i dettagli.


1
@AbhishekSinha Perché con mongo> = 4.0.0? Sto usando 3.6.5 e anche il fastidioso messaggio è andato.
greuze,

Sì, l'ho risolto. Fondamentalmente, è una funzionalità v4 ma v3.1.0 e versioni successive supportano anche la nuova funzionalità.
Abhishek Sinha,

3
Questo è il migliore, volevo solo aggiungere, se hai un callback, esp per errore, usa questo: mongoose.connect (dbUrl, {useNewUrlParser: true}, function (err) {console.log ("mongoDB connected", err);})
ptts

Grazie, risolto come professionista
Hidayt Rahman

46

Come notato, il 3.1.0-beta4rilascio del driver è stato "rilasciato in natura" un po 'presto dall'aspetto delle cose. La versione fa parte dei lavori in corso per supportare le nuove funzionalità della prossima versione di MongoDB 4.0 e apportare alcune altre modifiche all'API.

Una di queste modifiche che attiva l'avviso corrente è l' useNewUrlParseropzione, a causa di alcune modifiche al funzionamento effettivo del passaggio dell'URI di connessione. Ne parleremo più avanti.

Fino a quando le cose non si "sistemeranno", sarebbe probabilmente consigliabile "bloccare" almeno la versione minore per le 3.0.xversioni:

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

Ciò dovrebbe impedire l' 3.1.xinstallazione della diramazione su installazioni "nuove" sui moduli del nodo. Se hai già installato una versione "più recente" che è la versione "beta", allora dovresti ripulire i tuoi pacchetti (e package-lock.json) e assicurarti di 3.0.xscaricarlo fino a una versione in serie.

Per quanto riguarda effettivamente l'utilizzo delle "nuove" opzioni di URI di connessione, la restrizione principale è quella di includere effettivamente portla stringa di connessione:

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)
  }

})()

Questa è una regola più "rigorosa" nel nuovo codice. Il punto principale è che il codice corrente è essenzialmente parte del mongodbcodice del repository "nodo-nativo-driver" (npm ) e il "nuovo codice" in realtà importa dalla mongodb-corelibreria che "sostiene" il driver del nodo "pubblico".

Il punto dell '"opzione" che viene aggiunta è quello di "facilitare" la transizione aggiungendo l'opzione al nuovo codice in modo che il parser più recente (attualmente basato intorno url) venga utilizzato nel codice aggiungendo l'opzione e cancellando l'avvertimento di deprecazione, e quindi verificando che le stringhe di connessione passate sono effettivamente conformi a quanto previsto dal nuovo parser.

Nelle versioni future il parser 'legacy' verrebbe rimosso e quindi il nuovo parser sarà semplicemente quello che viene usato anche senza l'opzione. Ma a quel punto, si prevede che tutto il codice esistente avesse ampie opportunità di testare le stringhe di connessione esistenti rispetto a ciò che il nuovo parser si aspetta.

Quindi, se si desidera iniziare a utilizzare le nuove funzionalità del driver man mano che vengono rilasciate, utilizzare le versioni disponibili betae successive e idealmente assicurarsi di fornire una stringa di connessione valida per il nuovo parser abilitando l' useNewUrlParseropzione in MongoClient.connect().

Se in realtà non hai bisogno di accedere alle funzionalità relative all'anteprima della versione MongoDB 4.0, aggiungi la versione a una 3.0.xserie come notato in precedenza. Funzionerà come documentato e il "blocco" garantisce che le 3.1.xversioni non vengano "aggiornate" rispetto alla dipendenza prevista fino a quando non si desidera effettivamente installare una versione stabile.


1
Hai maggiori informazioni su cosa intendi quando dici "rilasciato in libertà"? In che modo 3.1.0-beta4 è fuggito dallo zoo? Puoi citare qualche riferimento a riguardo?
Wyck,

2
@Wyck Il "riferimento" era ovviamente che al momento della domanda, facendo sì npm install mongodbche la "beta" (chiaramente indicata nella stringa di versione mostrata nella domanda) fosse installata poiché era contrassegnata come stablenel repository npm quando non avrebbe dovuto essere. Questo era effettivamente un errore al momento e dovrebbe sempre essere considerato così se qualsiasi versione di codice che mostra alphao betaall'interno della stringa di versione è similmente contrassegnata come stabile. Ovviamente il tempo è passato e questa è una funzionalità nelle versioni stabili ora, fino a quando (come notato) alla fine scomparirà.
Neil Lunn,

45

Il codice evidenziato di seguito alla connessione della mangusta ha risolto l'avvertimento per il driver della mangusta:

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

4
non funziona per me. ancora ottenendo: (nodo: 35556) DeprecationWarning: il parser della stringa URL corrente è obsoleto e verrà rimosso in una versione futura. Per utilizzare il nuovo parser, passare l'opzione {useNewUrlParser: true} a MongoClient.connect.
Alex,

È necessario salvare server.js o app.js ovunque si stia fornendo il percorso DB se il problema persiste, eliminando e reinstallando node_modules immettendo npm install ogni volta che il file package.json è
Narendra Maru,

24

Non c'è nulla da cambiare. Passa solo nella funzione di connessione {useNewUrlParser: true }.

Questo funzionerà:

MongoClient.connect(url, {useNewUrlParser: true}, function(err, db) {
    if(err) {
        console.log(err);
    }
    else {
        console.log('connected to ' + url);
        db.close();
    }
})

Proprio quello di cui avevo bisogno, ma il messaggio di avviso è ancora lì: -S
alex351

Funziona per me, nessun avvertimento più.
Q. Qiao,

17

Devi aggiungere { useNewUrlParser: true }il metodo mongoose.connect ().

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

1
questa risposta è la stessa delle altre risposte che sono state pubblicate mesi prima
Daniel W.

In che cosa differisce dalle risposte precedenti?
Peter Mortensen l'

@PeterMortensen, controlla prima la data che ha inviato la risposta
KARTHIKEYAN.A

15

Il formato della stringa di connessione deve essere mongodb: // user: password @ host: port / db

Per esempio:

MongoClient.connect('mongodb://user:password@127.0.0.1:27017/yourDB', { useNewUrlParser: true } )

No. MongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } )funziona anche.
Nino Filiu,

In che cosa differisce dalle risposte precedenti?
Peter Mortensen,

15

Devi solo impostare le seguenti cose prima di connetterti al database come di seguito:

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

Anche,

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().

3
Dovrebbe essere la risposta migliore. Tutte le altre risposte per me sono fallite miseramente.
Anthony,

Pls segna la risposta come correctse avesse funzionato per te. Ha funzionato anche per me!
Arpan Banerjee,

9

Quanto segue funziona per me

const mongoose = require('mongoose');

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

La mongooseversione è 5.8.10.


1
Anche questo ha funzionato per me. Sto usando--body-parser": "^1.19.0", "express": "^4.17.1", "mongoose": "^5.9.14"
Banerjee

8

Non penso che tu debba aggiungere { useNewUrlParser: true }.

Dipende da te se desideri già utilizzare il nuovo parser URL. Alla fine l'avviso scompare quando MongoDB passa al nuovo parser URL.

Come specificato nel formato URI della stringa di connessione , non è necessario impostare il numero di porta.

Basta aggiungere { useNewUrlParser: true }.


1
Ho aggiunto il numero di porta e ricevo ancora il messaggio di errore. Trovo il messaggio di errore molto confuso e fuorviante: perché ricevo un messaggio che mi dice di usare il nuovo formato, quando in realtà sto usando il vecchio formato e funziona perfettamente ... !! ??
Nico,

2
Buona domanda! Si noti che è un avvertimento. Non è un errore. Solo aggiungendo useNewUrlParser: truel'avviso scompare. Ma è un po 'stupido in quanto questo parametro aggiuntivo diventerà obsoleto quando mongo passerà al loro nuovo parser url.
Sam,

come sapevi che il numero di porta è quello che si aspetta il nuovo parser url? Non riesco a trovare nulla che descriva effettivamente il nuovo parser dell'URL
Brad

@Brad, davvero. Supponevo che fosse necessario aggiungere il numero di porta, ma le specifiche Mongo menzionano ancora il numero di porta come facoltativo. Ho aggiornato la mia risposta di conseguenza.
Sam,

8

Aggiornato per ECMAScript 8 / waitit

Anche il codice demo ECMAScript 8 errato fornito da MongoDB inc crea questo avviso.

MongoDB fornisce i seguenti consigli, che non sono corretti

Per utilizzare il nuovo parser, passare l'opzione {useNewUrlParser: true} a MongoClient.connect.

Ciò causerà il seguente errore:

TypeError: l'argomento finale executeOperationdeve essere un callback

Invece l'opzione deve essere fornita anew MongoClient :

Vedi il codice qui sotto:

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
}

7

Il problema può essere risolto fornendo il numero di porta e usando questo parser: {useNewUrlParser: true}

La soluzione può essere:

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

Risolve il mio problema.


3
console stessa ha dato la soluzione per aggiungere useNewUrlParser propertyin connect, ma la soluzione ha aiutato. così votato!
Ganeshdeshmukh,

7

L'esempio completo per Express.js, il caso di chiamata API e l'invio di contenuto JSON è il seguente:

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

4

Ecco come ce l'ho. Il suggerimento non è stato mostrato sulla mia console fino a quando non ho aggiornato npm un paio di giorni prima.

.connect ha tre parametri, l'URI, le opzioni e err.

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

4

Stavamo usando:

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

→ Ciò genera un errore del parser URL

La sintassi corretta è:

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

1
Aggiungi una descrizione
Mathews Sunny

4

Hai solo bisogno di aggiungere

{ useNewUrlParser: true }

all'interno del metodo mongoose.connect.


1
In che cosa differisce dalle risposte precedenti?
Peter Mortensen,

controlla l'hash.
AGrush,

2

Il seguente lavoro per me per la versione 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))

1

Queste righe sono state utili anche per tutti gli altri avvisi di deprecazione:

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

1

Stavo usando mlab.com come database MongoDB. Ho separato la stringa di connessione in un'altra cartella denominata confige all'interno del file keys.js Ho mantenuto la stringa di connessione che era:

module.exports = {
  mongoURI: "mongodb://username:password@ds147267.mlab.com:47267/projectname"
};

E il codice del server era

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

Devi scrivere {useNewUrlParser: true} dopo la stringa di connessione come ho fatto sopra.

In poche parole, devi fare:

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


1

Sto usando mongoose versione 5.x per il mio progetto. Dopo aver richiesto il pacchetto mongoose, impostare il valore a livello globale come di seguito.

const mongoose = require('mongoose');

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

0

Se usernameo passwordha il @personaggio, allora usalo in questo modo:

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));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.