web-dev-qa-db-fra.com

Évitez l'avertissement "l'analyseur de chaîne d'URL actuel est obsolète" en définissant useNewUrlParser sur true

J'ai une classe de wrapper de base de données qui établit une connexion à une instance de MongoDB:

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

Cela m'a donné un avertissement:

(noeud: 4833) DeprecationWarning: l'analyseur de chaîne d'URL actuel est obsolète et sera supprimé dans une version ultérieure. Pour utiliser le nouvel analyseur, passez l'option {useNewUrlParser: true} à MongoClient.connect.

La méthode connect() accepte une instance MongoClientOptions comme second argument. Mais il n'a pas de propriété appelée useNewUrlParser. J'ai également essayé de définir ces propriétés dans la chaîne de connexion comme suit: mongodb://127.0.0.1/my-db?useNewUrlParser=true, mais cela n'a aucun effet sur ces avertissements. 

Alors, comment puis-je définir useNewUrlParser pour supprimer ces avertissements? Ceci est important pour moi car le script doit être exécuté en tant que cron et que ces avertissements génèrent du spam. 

J'utilise le pilote mongodb dans la version 3.1.0-beta4 avec le package @types/mongodb correspondant dans 3.0.18. Les deux sont les dernières disponibles en utilisant npm install.

Workaround

En utilisant une ancienne version du pilote mongodb:

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

133
Lion

Vérifiez votre version de mongo 

mongo --version

Si vous utilisez la version> = 3.1.0, changez le fichier de connexion mongo en ->

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

ou votre fichier de connexion mangouste vers ->

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

Idéalement, il s’agit d’une fonctionnalité de la version 4, mais elle est également prise en charge par les versions 3.1.0 et supérieures. Consultez MongoDB Github pour plus de détails.

277
Abhishek Sinha

Comme indiqué, la version 3.1.0-beta4 du pilote a été "relâchée dans la nature" un peu tôt par l'apparence. Cette version fait partie des travaux en cours visant à prendre en charge les nouvelles fonctionnalités de la prochaine version de MongoDB 4.0 et à apporter d'autres modifications à l'API.

L’une des modifications qui a déclenché l’avertissement actuel est l’option useNewUrlParser, en raison de certaines modifications apportées au fonctionnement de la transmission de l’URI de la connexion. Plus sur cela plus tard.

Jusqu'à ce que les choses se "calment", il serait probablement souhaitable de "épingler" au moins à la version mineure pour les versions de 3.0.x:

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

Cela devrait empêcher la branche 3.1.x d'être installée sur des installations "récentes" sur des modules de noeud. Si vous avez déjà installé une "dernière" version qui est la version "bêta", vous devez alors nettoyer vos packages (et package-lock.json) et vous assurer de la réduire à une version de la série 3.0.x.

En ce qui concerne l'utilisation des "nouvelles" options d'URI de connexion, la principale restriction consiste à inclure réellement la variable port dans la chaîne de connexion:

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

})()

C'est une règle plus "stricte" dans le nouveau code. Le point principal étant que le code actuel fait essentiellement partie du code du référentiel "node-native-driver" (npm mongodb ), et que le "nouveau code" est en réalité importé à partir de la bibliothèque mongodb-core qui "sous-tend "le pilote de noeud" public ".

L’option "option" ajoutée vise à "faciliter" la transition en ajoutant l’option au nouveau code afin que le nouvel analyseur (actuellement basé sur url ) soit utilisé dans le code en ajoutant l’option et en supprimant l’avertissement de désapprobation. et par conséquent, en vérifiant que vos chaînes de connexion transmises sont conformes aux attentes du nouvel analyseur.

Dans les versions à venir, l'analyseur "hérité" sera supprimé et le nouvel analyseur sera simplement ce qui est utilisé même sans l'option. Mais à ce moment-là, on s'attend à ce que tout le code existant ait amplement l'occasion de tester leurs chaînes de connexion existantes par rapport aux attentes du nouvel analyseur.

Par conséquent, si vous souhaitez commencer à utiliser les nouvelles fonctionnalités du pilote au fur et à mesure de leur publication, utilisez les versions disponibles beta et suivantes et veillez idéalement à fournir une chaîne de connexion valide pour le nouvel analyseur en activant l'option useNewUrlParser dans MongoClient.connect().

Si vous n'avez pas réellement besoin d'accéder aux fonctionnalités liées à la prévisualisation de la version MongoDB 4.0, épinglez la version à une série 3.0.x, comme indiqué précédemment. Cela fonctionnera comme documenté et "épinglant" cela garantit que les versions de 3.1.x ne sont pas "mises à jour" par rapport à la dépendance attendue jusqu'à ce que vous souhaitiez réellement installer une version stable.

38
Neil Lunn

Le code en surbrillance ci-dessous indiquant la connexion d'une mangouste a résolu l'avertissement concernant le conducteur de mangouste

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

Le format de la chaîne de connexion doit être: mongodb: // utilisateur: mot de passe @ hôte: port/db  

par exemple:

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

Besoin d'ajouter{ useNewUrlParser: true }dans la méthode mongoose.connect ().

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

Rien à changer, ne passez que dans la fonction de connexion {useNewUrlParser: true } cela fonctionnera 

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

Le problème peut être résolu en donnant le numéro de port et en utilisant cet analyseur.

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

Cela résout mon problème.

7
Mehedi Abdullah

Je ne pense pas que vous ayez besoin d'ajouter { useNewUrlParser: true }.

C’est à vous de décider si vous souhaitez déjà utiliser le nouvel analyseur d’URL. Finalement, l’avertissement disparaîtra lorsque Mongo bascule vers son nouvel analyseur d’URL.

Edit: Comme spécifié ici https://docs.mongodb.com/master/reference/connection-string/ vous n'avez pas besoin de définir le numéro de port.

Ajouter simplement { useNewUrlParser: true } suffit.

6
Sam

Voici comment je l'ai, l'indication n'apparaissant pas sur ma console jusqu'à ce que je mette à jour npm quelques jours auparavant. 

.connect a 3 paramètres, l’URI, les options et err. 

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

il vous suffit d'ajouter

{useNewUrlParser: true}

dans la méthode mongoose.connect

2
JakeS

L'exemple complet pour les envois expressJS, les appels api et l'envoi json est le suivant:

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

Mis à jour pour ES8/wait

Le code de démo ES8 incorrect que MongoDB inc fournit crée également cet avertissement. 

MongoDB fournit les conseils suivants, qui sont incorrects

Pour utiliser le nouvel analyseur, passez l'option {useNewUrlParser: true} à MongoClient.connect.

Cela provoquera l'erreur suivante:

TypeError: le dernier argument de executeOperation doit être un rappel

Au lieu de cela, l'option doit être fournie à new MongoClient:

Voir le code ci-dessous:

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

Ces lignes ont également fait l'affaire pour tous les autres avertissements de dépréciation:

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

Si username ou password a @ caractère. Alors utilise comme ça

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

J'utilisais mlab.com comme base de données Mongo. J'ai séparé la chaîne de connexion dans un autre dossier nommé config et à l'intérieur de keys.js. J'ai conservé la chaîne de connexion qui était 

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

et le code du serveur était 

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

vous devez écrire {useNewUrlParser: true} après la chaîne de connexion, comme je l'ai fait ci-dessus. 

tout simplement vous devez faire:

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


      

0
zibon