Unikaj ostrzeżenia „bieżący analizator ciągu adresów URL jest przestarzały”, ustawiając wartość useNewUrlParser na wartość true


239

Mam klasę opakowania bazy danych, która nawiązuje połączenie z niektórymi instancjami MongoDB:

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

To dało mi ostrzeżenie:

(node: 4833) DeprecationWarning: bieżący parser ciągów adresów URL jest przestarzały i zostanie usunięty w przyszłej wersji. Aby użyć nowego analizatora składni, przekaż opcję {useNewUrlParser: true} do MongoClient.connect.

connect()Sposób przyjmuje MongoClientOptionsprzykład, jako drugi argument. Ale nie ma właściwości o nazwieuseNewUrlParser . Próbowałem również ustawić te właściwości w ciągu połączenia w następujący sposób: mongodb://127.0.0.1/my-db?useNewUrlParser=trueale nie ma to wpływu na te ostrzeżenia.

Więc jak mogę ustawić useNewUrlParser aby usunąć te ostrzeżenia? Jest to dla mnie ważne, ponieważ skrypt powinien działać jako cron, a ostrzeżenia te powodują spam spamowy.

Używam mongodbsterownika w wersji 3.1.0-beta4z odpowiednim @types/mongodbpakietem w3.0.18 . Oba są najnowszymi dostępnymi npm install.

Obejście

Korzystanie ze starszej wersji sterownika mongodb:

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

5
To pochodzi z betawersji, która jakoś wydała na npm w weekend. Nie przejmuj się nim, dopóki interfejs API nie zostanie faktycznie sfinalizowany. Zrobiłeś dobrze, instalując stabilną wersję.
Neil Lunn

1
powyżej 3.0.0 mongodb dodaj po prostu mongoose.connect („mongodb: // localhost: portnumber / YourDB”, {useNewUrlParser: true})
Majedur Rahaman

Odpowiedzi:


402

Sprawdź swoją mongowersję:

mongo --version

Jeśli używasz wersji> = 3.1.0, zmień mongoplik połączenia na ->

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

lub plik połączenia mangusty do ->

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

Idealnie jest to funkcja w wersji 4, ale v3.1.0 i nowsze również ją obsługują. Sprawdź szczegóły MongoDB GitHub .


1
@AbhishekSinha Dlaczego z mongo> = 4.0.0? Używam 3.6.5 i irytująca wiadomość zniknęła.
greuze,

Tak, naprawiłem to. Zasadniczo jest to funkcja v4, ale wersja 3.1.0 i nowsze obsługuje również nową funkcję.
Abhishek Sinha,

3
Jest to najlepsze, po prostu chciałem dodać, jeśli masz oddzwanianie, szczególnie w przypadku błędu, po prostu użyj tego: mongoose.connect (dbUrl, {useNewUrlParser: true}, funkcja (err) {console.log („połączenie mongoDB”, err);})
pt.

Dzięki, Naprawiono jak pro
Hidayt Rahman

46

Jak już wspomniano, 3.1.0-beta4wydanie sterownika zostało „wypuszczone na wolność” nieco wcześniej. Wydanie jest częścią trwających prac nad obsługą nowszych funkcji w nadchodzącej wersji MongoDB 4.0 i wprowadzeniem innych zmian w interfejsie API.

Jedną z takich zmian wywołujących bieżące ostrzeżenie jest useNewUrlParseropcja z powodu pewnych zmian dotyczących sposobu, w jaki faktycznie działa przekazywanie identyfikatora URI połączenia. Więcej o tym później.

Do czasu, aż wszystko się „uspokoi”, prawdopodobnie wskazane byłoby „przypięcie” przynajmniej do mniejszej wersji 3.0.xwydań:

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

To powinno powstrzymać instalację 3.1.xgałęzi w „świeżych” instalacjach modułów węzłów. Jeśli już zainstalowałeś „najnowszą” wersję, która jest wersją „beta”, powinieneś wyczyścić swoje pakiety (i package-lock.json) i upewnić się, że podbijesz to do3.0.x wersji seryjnej.

Jeśli chodzi o korzystanie z opcji „nowego” identyfikatora URI połączenia, głównym ograniczeniem jest włączenie portłańcucha połączenia:

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

})()

To jest bardziej „ścisła” reguła w nowym kodzie. Głównym punktem jest to, że bieżący kod jest zasadniczo częścią mongodbkodu repozytorium „natywny sterownik węzła” (npm ), a „nowy kod” faktycznie importuje się zmongodb-core biblioteki, która „stanowi podstawę” „publicznego” sterownika węzła.

Dodawaną „opcją” jest „ułatwienie” przejścia przez dodanie opcji do nowego kodu, aby nowszy parser (faktycznie oparty na url w kodzie jest używany ) do dodania opcji i wyczyszczenia ostrzeżenia o wycofaniu, a zatem sprawdzenia, czy przekazane parametry połączenia są zgodne z oczekiwaniami nowego analizatora składni.

W przyszłych wydaniach parser „starszy” zostałby usunięty, a następnie nowy parser będzie po prostu używany bez opcji. Ale do tego czasu oczekuje się, że cały istniejący kod miał wystarczającą okazję do przetestowania istniejących parametrów połączenia pod kątem tego, czego oczekuje nowy parser.

Jeśli więc chcesz zacząć korzystać z nowych funkcji sterownika w momencie ich wydania, skorzystaj z dostępnych betai kolejnych wydań, a najlepiej upewnij się, że podajesz ciąg połączenia, który jest ważny dla nowego parsera, włączając useNewUrlParseropcję w MongoClient.connect().

Jeśli tak naprawdę nie potrzebujesz dostępu do funkcji związanych z podglądem wersji MongoDB 4.0, przypnij wersję do 3.0.xserii, jak wspomniano wcześniej. Będzie to działać zgodnie z dokumentacją, a „przypinanie” zapewni, że 3.1.xwydania nie będą „aktualizowane” w stosunku do oczekiwanej zależności, dopóki faktycznie nie chcesz zainstalować stabilnej wersji.


1
Czy masz więcej informacji na temat tego, co masz na myśli, mówiąc „wypuszczony na wolność”? W jaki sposób 3.1.0-beta4 uciekło z zoo? Czy możesz przytoczyć jakieś referencje na ten temat?
Wyck

2
@Wyck „Referencją” było oczywiście to, że w momencie zadawania pytania, co npm install mongodbskutkowało instalacją „beta” (wyraźnie zaznaczonego w łańcuchu wersji pokazanym w pytaniu), ponieważ był on oznaczony jak stablew repozytorium npm, kiedy nie powinno być. Był to rzeczywiście błąd w tym czasie i należy go zawsze brać pod uwagę, więc jeśli jakiekolwiek wydanie kodu pokazujące ciąg znaków alphalub betaw nim zawarte jest podobnie oznaczone jako stabilne. Oczywiście czas minął i jest to cecha w stabilnych wydaniach teraz, aż (jak wspomniano) w końcu zniknie.
Neil Lunn

45

Poniższy podświetlony kod połączenia mongoose rozwiązał ostrzeżenie dla sterownika mangusty:

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

4
nie działa dla mnie. wciąż otrzymuje: (węzeł: 35556) DeprecationWarning: bieżący parser ciągów URL jest przestarzały i zostanie usunięty w przyszłej wersji. Aby użyć nowego analizatora składni, przekaż opcję {useNewUrlParser: true} do MongoClient.connect.
Alex

Musisz zapisać server.js lub app.js wszędzie tam, gdzie podajesz ścieżkę DB, jeśli nadal nie działa, spróbuj usunąć i ponownie zainstalować moduły node_moduł, wprowadzając npm install za każdym razem, gdy masz plik package.json
Narendra Maru

24

Nie ma nic do zmiany. Przekaż tylko w funkcji połączenia{useNewUrlParser: true } .

To zadziała:

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

Właśnie tego potrzebowałem, ale wciąż pojawia się komunikat ostrzegawczy: -S
alex351,

Działa dla mnie, bez ostrzeżeń.
Q. Qiao,

17

Musisz dodać { useNewUrlParser: true }metodę mongoose.connect ().

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

1
ta odpowiedź jest taka sama jak inne odpowiedzi, które zostały opublikowane kilka miesięcy wcześniej
Daniel W.

Czym różni się to od poprzednich odpowiedzi?
Peter Mortensen

@PeterMortensen sprawdź datę, która jako pierwsza opublikowała odpowiedź
KARTHIKEYAN.A

15

Format ciągu połączenia musi być mongodb: // użytkownik: hasło @ host: port / db

Na przykład:

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

Nie. Też MongoClient.connect('mongodb://127.0.0.1:27017/yourDB', { useNewUrlParser: true } )działa.
Nino Filiu

Czym różni się to od poprzednich odpowiedzi?
Peter Mortensen

15

Musisz tylko ustawić następujące rzeczy przed połączeniem z bazą danych, jak poniżej:

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

Również,

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
Powinna być najlepsza odpowiedź. Wszystkie inne odpowiedzi dla mnie zawiodły.
Anthony

Pls zaznacz ans, correctjakby zadziałało dla ciebie. Dla mnie też zadziałało!
Arpan Banerjee

9

Poniższe działa dla mnie

const mongoose = require('mongoose');

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

mongooseWersja jest 5.8.10.


1
Ten również działał dla mnie. Używam--body-parser": "^1.19.0", "express": "^4.17.1", "mongoose": "^5.9.14"
Arpan Banerjee

8

Nie sądzę, że musisz dodać { useNewUrlParser: true }.

To, czy chcesz już korzystać z nowego parsera adresów URL, zależy od Ciebie. Ostatecznie ostrzeżenie zniknie, gdy MongoDB przełączy się na nowy parser adresów URL.

Jak określono w formacie URI ciągu połączenia , nie trzeba ustawiać numeru portu.

Wystarczy dodanie { useNewUrlParser: true }.


1
Dodałem numer portu i nadal pojawia się komunikat o błędzie. Uważam komunikat o błędzie za bardzo mylący i wprowadzający w błąd: dlaczego otrzymuję komunikat z informacją, że mam użyć nowego formatu, skoro w rzeczywistości używam starego formatu i działa on doskonale ... !! ??
Nico,

2
Dobre pytanie! Pamiętaj, że to ostrzeżenie. To nie jest błąd. Tylko przez dodanie useNewUrlParser: trueostrzeżenie zniknie. Ale to trochę głupie, ponieważ ten dodatkowy parametr stanie się przestarzały, gdy mongo przełączy się na nowy parser adresów URL.
Sam

skąd wiesz, że numer portu jest tym, czego oczekuje nowy parser adresów URL? Nie mogę znaleźć niczego, co faktycznie opisywałoby nowy parser adresów URL
Brad

@Brad, rzeczywiście. Zakładałem, że musisz dodać numer portu, ale specyfikacje Mongo nadal wspominają, że numer portu jest opcjonalny. Zaktualizowałem odpowiednio swoją odpowiedź.
Sam

8

Zaktualizowano dla ECMAScript 8 / czekaj

Nieprawidłowy kod demonstracyjny ECMAScript 8 MongoDB inc również tworzy to ostrzeżenie.

MongoDB zawiera następujące porady, które są niepoprawne

Aby użyć nowego analizatora składni, przekaż opcję {useNewUrlParser: true} do MongoClient.connect.

Może to spowodować następujący błąd:

TypeError: końcowy argument executeOperationmusi być wywołaniem zwrotnym

Zamiast tego należy podać opcjęnew MongoClient :

Zobacz poniższy kod:

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

Problem można rozwiązać, podając numer portu i używając tego analizatora składni: {useNewUrlParser: true}

Rozwiązaniem może być:

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

To rozwiązuje mój problem.


3
Sama konsola dało rozwiązanie, aby dodać useNewUrlParser propertyw connect, ale rozwiązanie pomogło. więc głosowałem!
ganeshdeshmukh

7

Pełny przykład Express.js, przypadku wywołania API i wysyłania treści JSON jest następujący:

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

Oto jak to mam. Wskazówka nie pojawiła się na mojej konsoli, dopóki kilka dni wcześniej nie zaktualizowałem npm.

.connect ma trzy parametry: identyfikator URI, opcje i err.

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

4

Używaliśmy:

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

→ Daje to błąd analizatora składni adresu URL

Prawidłowa składnia to:

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
Dodaj opis
Mathews Sunny,


2

Poniższa praca dla mnie dla wersji 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

Te wiersze pomogły również w przypadku wszystkich innych ostrzeżeń o wycofaniu:

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

1

Korzystałem z mlab.com jako bazy danych MongoDB. Oddzieliłem ciąg połączenia do innego folderu o nazwie configi wewnątrz pliku klucze.js Zachowałem ciąg połączenia, który był:

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

A kod serwera był

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

Musisz napisać {useNewUrlParser: true} po łańcuchu połączenia, tak jak powyżej.

Mówiąc najprościej, musisz zrobić:

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


1

Używam mangusty w wersji 5.x do mojego projektu. Po wymaganiu pakietu mangusty ustaw wartość globalną jak poniżej.

const mongoose = require('mongoose');

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

0

Jeśli usernamelub passwordma @postać, użyj jej w następujący sposób:

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));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.