node.js - Vältä "current URL string parser is deprecated" -varoitus asettamalla useNewUrlParser arvoksi true


Minulla on tietokannan kääreluokka, joka muodostaa yhteyden johonkin MongoDB-instanssiin:

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

Tämä antoi minulle varoituksen:

(node:4833) Vanhentumisvaroitus: nykyinen URL-merkkijonon jäsentäjä on poistumassa käytöstä, ja se poistetaan tulevassa versiossa. Käyttääksesi uutta jäsentäjää, anna vaihtoehto { useNewUrlParser: true } MongoClient.connect-metodille.

connect()-metodi hyväksyy MongoClientOptions-instanssin toisena argumenttina. Mutta sillä ei ole ominaisuutta nimeltä useNewUrlParser. Yritin myös asettaa tämän ominaisuuden yhteysmerkkijonossa näin: mongodb://127.0.0.1/my-db?useNewUrlParser=true, mutta sillä ei ole vaikutusta näihin varoituksiin.

Joten miten voin asettaa useNewUrlParser poistaakseni nuo varoitukset? Tämä on minulle tärkeää, koska skriptin pitäisi toimia cronina ja nuo varoitukset johtavat roskapostiin.

Käytän mongodb-ajuria versiossa 3.1.0-beta4 vastaavan @types/mongodb-paketin kanssa versiossa 3.0.18. Molemmat ovat uusimmat saatavilla npm install-komennolla.

Väliaikainen ratkaisu

Käytetään vanhempaa MongoDB-ajuria:

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

Vastaus #1

Tarkista mongo -versiosi:

mongo --version

Jos käytät versiota >= 3.1.0, muuta mongo -yhteystiedostosi seuraavasti ->

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

tai mongoose-yhteystiedostosi kohtaan ->

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

Ihanteellisesti se on versio 4 ominaisuus, mutta myös v3.1.0 ja uudemmat tukevat sitä. Katso lisätietoja MongoDB:n GitHubista.

Vastaus #2

Kuten todettu, ohjaimen 3.1.0-beta4 versio julkaistiin näköjään hieman etuajassa. Julkaisu on osa työn alla olevaa kehitystä tukemaan uusia ominaisuuksia tulevassa MongoDB 4.0 -julkaisussa ja tekemään joitakin muita API-muutoksia.

Yksi tällainen muutos, joka laukaisee nykyisen varoituksen, on useNewUrlParser-asetus, johtuen joistakin muutoksista siitä, miten yhteys-URI:n välittäminen todellisuudessa toimii. Lisää siitä myöhemmin.

Kunnes asiat "lientyvät", olisi todennäköisesti suositeltavaa "yhdistää" ainakin pienempään versioon 3.0.x julkaisuissa:

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

Tämän pitäisi estää 3.1.x -haaran asentuminen "tuoreisiin" asennuksiin node-moduuleissa. Jos olet jo asentanut "uusimman" julkaisun, joka on "beeta" -versio, sinun tulisi siivota paketit (ja package-lock.json) ja varmistaa, että päivität sen 3.0.x -sarjan julkaisuun.

Mitä tulee itse "uusien" yhteys-URI-vaihtoehtojen käyttämiseen, tärkein rajoitus on tosiasiallisesti sisällyttää port yhteysmerkkijonoon:

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

})()

Se on tiukempi sääntö uudessa koodissa. Pääasia on, että nykyinen koodi on käytännössä osa "node-native-driver" (npm mongodb) -varaston koodia, ja "uusi koodi" tuo itse asiassa kirjastosta mongodb-core, joka "tukee" julkista Node-ajuria.

Sen "vaihtoehdon" lisäämisen tarkoituksena on "helpottaa" siirtymää lisäämällä vaihtoehto uuteen koodiin, jotta uudempi jäsentäjä (joka pohjautuu käytännössä url:iin) otetaan käyttöön koodissa vaihtoehtoa lisättäessä ja vanhentumisvaroitus poistetaan, ja näin varmistetaan, että antamasi yhteysmerkkijonot todella noudattavat sitä, mitä uusi jäsentäjä odottaa.

Tulevissa julkaisuissa 'perinteinen' jäsentäjä poistetaan, ja sitten uusi jäsentäjä on yksinkertaisesti se, mitä käytetään, vaikka vaihtoehtoa ei olisikaan. Mutta siihen mennessä on odotettavissa, että kaikilla olemassa olevilla koodeilla on ollut riittävästi mahdollisuuksia testata olemassa olevia yhteysmerkkijonojaan uuden jäsentäjän odotusten mukaisesti.

Joten jos haluat alkaa käyttää uusia ohjainominaisuuksia heti niiden julkaisun yhteydessä, käytä saatavilla olevia beta ja myöhempiä julkaisuja ja varmista mieluiten, että tarjoat yhteysmerkkijonon, joka on kelvollinen uudelle jäsentäjälle ottamalla käyttöön useNewUrlParser-vaihtoehto MongoClient.connect()-kutsussa.

Jos et oikeasti tarvitse pääsyä ominaisuuksiin, jotka liittyvät MongoDB 4.0 -julkaisun esikatseluun, aseta versio lukittavaksi 3.0.x-sarjaan kuten aiemmin mainittiin. Tämä toimii dokumentoitujen ohjeiden mukaan, ja tämän "lukitseminen" varmistaa, että 3.1.x-julkaisut eivät "päivity" odotetun riippuvuuden yli ennen kuin haluat itse asentaa vakaan version.

Vastaus #3

Alla korostettu koodi Mongoose-yhteyteen ratkaisi varoituksen Mongoose-ajurille:

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

Vastaus #4

Ei ole mitään muutettavaa. Käytä vain yhteysfunktiossa {useNewUrlParser: true }.

Tämä toimii:

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

Vastaus #5

Sinun tarvitsee vain asettaa seuraavat asiat ennen yhteyden muodostamista tietokantaan seuraavasti:

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

Myös,

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

Vastaus #6

Sinun täytyy lisätä { useNewUrlParser: true } mongoose.connect()-metodiin.

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

Vastaus #7

Yhteysmerkkijonon muodon on oltava mongodb://user:password@host:port/db

Esimerkiksi:

MongoClient.connect('mongodb://user:[email :27017/yourDB', { useNewUrlParser: true } )

Vastaus #8

Seuraava toimii minulle

const mongoose = require('mongoose');

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

mongoose-versio on 5.8.10.

Aiheeseen liittyviä artikkeleita