Silnik wykrywania i monitorowania serwera jest przestarzały


105

Używam Mongoose z moją aplikacją Node.js i to jest moja konfiguracja:

mongoose.connect(process.env.MONGO_URI, {
   useNewUrlParser: true,
   useUnifiedTopology: true,
   useCreateIndex: true,
   useFindAndModify: false
}).then(()=>{
    console.log(`connection to database established`)
}).catch(err=>{
    console.log(`db error ${err.message}`);
    process.exit(-1)
})

ale w konsoli nadal daje mi ostrzeżenie:

Przestarzałe Ostrzeżenie: obecny mechanizm wykrywania i monitorowania serwera jest przestarzały i zostanie usunięty w przyszłej wersji. Aby użyć nowego mechanizmu wykrywania i monitorowania serwera, przekaż opcję {useUnifiedTopology: true} do konstruktora MongoClient.

Jaki jest problem? Nie używałem useUnifiedTopologywcześniej, ale teraz pojawia się w konsoli. Dodałem go do konfiguracji, ale nadal daje mi to ostrzeżenie, dlaczego? Nawet nie używam MongoClient.

Edytować

Jak odpowiedział Felipe Plets, wystąpił problem w Mongoose i naprawiono ten błąd w późniejszych wersjach. Możesz więc rozwiązać problem, aktualizując wersję Mongoose.

Odpowiedzi:


184

Aktualizacja

Mongoose 5.7.1 został wydany i wydaje się, że rozwiązuje problem, więc skonfigurowanie useUnifiedTopologyopcji działa zgodnie z oczekiwaniami.

mongoose.connect(mongoConnectionString, {useNewUrlParser: true, useUnifiedTopology: true});

Oryginalna odpowiedź

Miałem ten sam problem i postanowiłem zagłębić się w kod Mongoose: https://github.com/Automattic/mongoose/search?q=useUnifiedTopology&unscoped_q=useUnifiedTopology

Wydaje się, że jest to opcja dodana w wersji 5.7 Mongoose i nie jest jeszcze dobrze udokumentowana. Nie mogłem nawet znaleźć tego wspomnianego w historii biblioteki https://github.com/Automattic/mongoose/blob/master/History.md

Zgodnie z komentarzem w kodzie:

  • @param {Boolean} [options.useUnifiedTopology = false] Domyślnie fałsz. Ustaw, aby truewyrazić zgodę na zestaw replik sterownika MongoDB i silnik monitorowania klastra podzielonego na fragmenty.

W projekcie GitHub jest również problem dotyczący tego błędu: https://github.com/Automattic/mongoose/issues/8156

W moim przypadku nie używam Mongoose w zestawie replik lub klastrze podzielonym na fragmenty i chociaż opcja powinna być fałszywa. Ale jeśli fałsz, narzeka, ustawienie powinno być prawdziwe. Kiedyś to prawda, nadal nie działa, prawdopodobnie dlatego, że moja baza danych nie działa w zestawie replik lub klastrze podzielonym na fragmenty.

Zmieniłem wersję do 5.6.13 i mój projekt znów działa poprawnie. Więc jedyną opcją, jaką widzę na razie, jest obniżenie jej wersji i czekanie, aż poprawka zostanie zaktualizowana do nowszej wersji.


Myślałem tak samo (wersja obniżona), używam klastrów mlab, więc może jest to powód, dla którego ostrzeżenie nie znika?
iLiA

2
jest błąd w najnowszej mongoose, 5.7.7jeśli używasz createConnection()zamiast connect(), jak mongoose.createConnection(conString, { useUnifiedTopology: true }). useUnifiedTopologynie będą brane pod uwagę i nadal otrzymasz ostrzeżenie. Wydarzenie, w którym mongoose.set('useUnifiedTopology', true)nadal otrzymuję ostrzeżenie.
Louis Grellet

2
Ostrzeżenie nadal utrzymuje się po obniżeniu do 5.6.13
O'Dane Brissett

1
Otrzymuję ten błąd, używając natywnego sterownika MongoDB!
Akhila

Tutaj mamy wszystkie przestarzałe opcje: mongoosejs.com/docs/deprecations.html
Murtaza Ahmad

28

W mongoDB zrezygnowali z obecnego pakietu monitorowania serwera i silnika, więc musisz użyć nowego pakietu monitorowania serwera i silnika. Więc po prostu użyj

{useUnifiedTopology: true}

mongoose.connect("paste db link", {useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true });

13
jeśli czytasz moje pytanie to wspomniałem tam, że dodałem useUnifiedTopology: truew mojej konfiguracji i nadal pokazuje mi ostrzeżenie
iLiA

5
Miałem ten problem i też dodaję useUnifiedTopology: trueale nadal ta sama wiadomość pojawia się na konsoli.
RSA

7
Jeśli ktoś nadal otrzymuje wiadomość, spróbuj zadzwonić mongoose.set('useUnifiedTopology', true)przed mongoose.connect.
dev4life

Tak, to jest właściwa odpowiedź. Wystarczy umieścić "useUnifiedTopology: true, useNewUrlParser: true" w parze {}. Nie użyłem jednak „useCreateIndex: true”, ale daje mi to pewne wyobrażenie. Sposób dev4life również działa.
William Hou

mongoose .connect ("db conn url", {useUnifiedTopology: true, useNewUrlParser: true,}) .then (() => console.log ('MongoDB Connected!')) .catch (err => {err => console .log (err)}) to właśnie zadziałało dla mnie
Sanket Sonavane

9

To rozwiązało mój problem.

 const url = 'mongodb://localhost:27017';

 const client = new MongoClient(url, {useUnifiedTopology: true});

dzięki za odpowiedź, ale to jest pytanie mangusty, a ja nie używam mongoclienta
iLiA

4
@iLiA Nie ma za co. Tak, wiem. Ale ta odpowiedź może być komuś pomocna, ponieważ znalazłem twoje pytanie dokładnie według tematu, a nie treści (a treść twojego pytania jest bardzo zbliżona do ogólnych informacji o MongoClient)
Юрий Светлов

3

Możesz spróbować oczekiwać async

const connectDB = async () => {
    try {
        await mongoose.connect(<database url>, {
            useNewUrlParser: true,
            useCreateIndex: true,
            useUnifiedTopology: true,
            useFindAndModify: false
        });
        console.log("MongoDB Conected")
    } catch (err) {
        console.error(err.message);
        process.exit(1);
    }
};


Użyj {useUnifiedTopology: true}
Niran Yousuf

3

Dodaj opcję useUnifiedTopology i ustaw ją na wartość true .

Ustaw inne 3 konfiguracje opcji mongoose.connect, które zajmą się innymi pozostałymi opcjami DeprecationWarning .

Ta konfiguracja działa dla mnie!

const url = 'mongodb://localhost:27017/db_name';
mongoose.connect(
    url, 
    { 
        useNewUrlParser: true, 
        useUnifiedTopology: true,
        useCreateIndex: true,
        useFindAndModify: false
    }
)

Spowoduje to rozwiązanie problemu 4 DeprecationWarning .

  1. Bieżący parser ciągu URL jest przestarzały i zostanie usunięty w przyszłej wersji. Aby użyć nowego parsera, przekaż opcję {useNewUrlParser: true} do MongoClient.connect.
  2. Obecny mechanizm wykrywania i monitorowania serwera jest przestarzały i zostanie usunięty w przyszłej wersji. Aby użyć nowego mechanizmu wykrywania i monitorowania serwera, przekaż opcję {useUnifiedTopology: true} do konstruktora MongoClient.
  3. Collection.ensureIndex jest przestarzała. Zamiast tego użyj createIndexes.
  4. DeprecationWarning: Mongoose: findOneAndUpdate()i findOneAndDelete()bez useFindAndModifyopcji ustawionej na false są przestarzałe. Zobacz: https://mongoosejs.com/docs/deprecations.html#-findandmodify- .

Mam nadzieję, że to pomoże.


3

Użyj poniższego kodu, aby uniknąć tego błędu

MongoClient.connect(connectionString, {useNewUrlParser: true, useUnifiedTopology: true});

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

Usunie następujące błędy: -

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

(węzeł: 7481) Przestarzałe Ostrzeżenie: obecny mechanizm wykrywania i monitorowania serwera jest przestarzały i zostanie usunięty w przyszłej wersji. Aby użyć nowego mechanizmu wykrywania i monitorowania serwera, przekaż opcję {useUnifiedTopology: true} do konstruktora MongoClient.


3
Pamiętaj też, aby dodać useUnifiedTopology: truedo wszystkich zależności korzystających z mongoDB, w moim przypadku wiston-mongodbmusiałem to również dodać w opcji winston.add(new winston.transports.MongoDB({ db: config.get('db'), options: { useUnifiedTopology: true } }));
Gael Musikingala

@GaelMusikingala to był mój problem. Dziękuję za zwrócenie uwagi
akmalhakimi1991,

@GaelMusikingala, Dzięki za uratowanie mi życia. ❤️ 👏
Mr.spShuvo,

1
const mongoose = require("mongoose");

mongoose.connect('mongodb://localhost:27017/Edureka',{ useNewUrlParser: true, useUnifiedTopology: true }, (error)=> {
    const connectionStatus = !error ? 'Success': 'Error Connecting to database';
    console.log(connectionStatus);
});

1

Jeśli z jakiegoś powodu twój kod zawiera createConnetion (w moim przypadku używam GridFsStorage), spróbuj dodać do swojego kodu:

    options: {
        useUnifiedTopology: true,
    }

zaraz po pliku, na przykład:

    const storage = new GridFsStorage({
    url: mongodbUrl,
    file: (req, file) => {
        return new Promise((resolve, reject) => {
            crypto.randomBytes(16, (err, buf) => {
                if (err) {
                    return reject(err);
                }
                const filename = buf.toString('hex') + path.extname(file.originalname);
                const fileInfo = {
                    filename: filename,
                    bucketName: 'uploads'
                };
                resolve(fileInfo);
            });
        });
    },
    options: {
        useUnifiedTopology: true,
    }
})

Jeśli Twoja sprawa wygląda jak moja, to z pewnością rozwiąże Twój problem. pozdrowienia


0

Miałem również do czynienia z tym samym problemem:

  1. Upewniłem się, że jestem podłączony do mongoDB, uruchamiając na terminalu następujące polecenie:

    brew services start mongodb-community@4.2
    

    I otrzymałem wyjście:

    Successfully started `mongodb-community`
    

Instrukcja instalacji mongodb na
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/ lub https://www.youtube.com/watch?v=IGIcrMTtjoU

  1. Moja konfiguracja wyglądała następująco:

    mongoose.connect(config.mongo_uri, {
        useUnifiedTopology: true,
        useNewUrlParser: true})
        .then(() => console.log("Connected to Database"))
        .catch(err => console.error("An error has occured", err));
    

Co rozwiązało mój problem!


0
   const mongo = require('mongodb').MongoClient;

   mongo.connect(process.env.DATABASE,{useUnifiedTopology: true, 
   useNewUrlParser: true}, (err, db) => {
      if(err) {
    console.log('Database error: ' + err);
   } else {
    console.log('Successful database connection');
      auth(app, db)
      routes(app, db)

   app.listen(process.env.PORT || 3000, () => {
      console.log("Listening on port " + process.env.PORT);
    });  

}});


0

Ustawienie połączenia mongoose useUnifiedTopology: opcja true

  import mongoose from 'mongoose';

        const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
        const database = 'DBName'; // REPLACE WITH YOUR DB NAME
        class Database {
          constructor() {
            this._connect();
          }
          _connect() {
            mongoose.Promise = global.Promise;
            // * Local DB SERVER *
            mongoose
              .connect(`mongodb://${server}/${database}`, {
                useNewUrlParser: true,
                useCreateIndex: true,
                useUnifiedTopology: true
              })
              .then(
                () => console.log(`mongoose version: ${mongoose.version}`),
                console.log('Database connection successful'),
              )
              .catch(err => console.error('Database connection error', err));   
          }
        }
        module.exports = new Database();

0

To zadziałało dla mnie

Dla osób używających MongoClientspróbuj tego:

MongoClient.connect(connectionurl, 
  {useUnifiedTopology: true, useNewUrlParser: true},  callback() {

W przypadku mangusty:

mongoose.connect(connectionurl, 
         {useUnifiedTopology: true, useNewUrlParser: true}).then(()=>{

Usuń inne opcje połączenia


1
Przyznałem, że nie używam mongoClient
iLiA

0

Chcę dodać do tego wątku, że może to mieć również związek z innymi zależnościami.

Na przykład nic, co zaktualizowałem lub ustawiłem dla NodeJS, MongoDB lub Mongoose, nie było problemem - jednak - connect-mongodb-sessionnie zostało zaktualizowane i nie zaczęło wyświetlać tego samego błędu. Rozwiązaniem w tym przypadku było po prostu przywrócenie wersji connect-mongodb-sessionfrom version 2.3.0do 2.2.0.

wprowadź opis obrazu tutaj


0

Za każdym razem pojawiały się te same błędy i to zadziałało

mongoose.connect("mongodb://localhost:27017/${yourDB}", {
    useNewUrlParser: true,
    useUnifiedTopology: true

}, function (err) {
    if (err) {
        console.log(err)
    } else {
        console.log("Database connection successful")
    }
});

0

użyj tej linii, to zadziałało dla mnie

mongoose.set('useUnifiedTopology', true);

1
Jeśli to możliwe, postaraj się podać dodatkowe wyjaśnienia zamiast tylko kodu. Takie odpowiedzi są zwykle bardziej przydatne, ponieważ pomagają członkom społeczności, a zwłaszcza nowym programistom, lepiej zrozumieć uzasadnienie rozwiązania i mogą pomóc w uniknięciu konieczności zadawania dodatkowych pytań.
Rajan

0

Jeśli korzystasz z serwera MongoDB, to po użyciu connect w zegarze klastra podczas łączenia i znalezieniu adresu URL, adres URL będzie podobny do tego

<mongodb+srv://Rohan:<password>@cluster0-3kcv6.mongodb.net/<dbname>?retryWrites=true&w=majority>

W takim przypadku nie zapomnij zastąpić hasła hasłem bazy danych i nazwą bazy danych, a następnie użyj

const client = new MongoClient(url,{useUnifiedTopology:true});

0
mongoose.connect("DBURL", {useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true },(err)=>{
    if(!err){
         console.log('MongoDB connection sucess');
        }
    else{ 
        console.log('connection not established :' + JSON.stringify(err,undefined,2));
    }
});

Jeśli to możliwe, postaraj się podać dodatkowe wyjaśnienia zamiast tylko kodu. Takie odpowiedzi są zwykle bardziej przydatne, ponieważ pomagają członkom społeczności, a zwłaszcza nowym programistom, lepiej zrozumieć uzasadnienie rozwiązania i mogą pomóc w uniknięciu konieczności zadawania dodatkowych pytań.
Rajan

0

To proste, usuń kod, którego użyłeś i użyj poniższego kodu:

const url = 'mongodb://localhost:27017';
var dbConn = mongodb.MongoClient.connect(url, {useUnifiedTopology: true});

0

jeśli użyłeś skryptu, dodaj konfigurację do MongoOptions

const MongoOptions: MongoClientOptions = {
  useNewUrlParser: true,
  useUnifiedTopology: true,
};

      const client = await MongoClient.connect(url, MongoOptions);

if you not used typescript  
const MongoOptions= {
  useNewUrlParser: true,
  useUnifiedTopology: true,
};

0

Ważne jest, aby uruchomić polecenie mongod i utrzymać działanie serwera. Jeśli nie, nadal będziesz widzieć ten błąd.

Załączam mój kod:

const mongodb = require('mongodb')
const MongoClient = mongodb.MongoClient

const connectionURL = 'mongodb://127.0.0.1:27017'
const databaseName = 'task-manager'

MongoClient.connect(connectionURL, {useNewUrlParser: true, useUnifiedTopology: true}, (error, client) => {
    if(error) {
        return console.log('Error connecting to the server.')
    }

    console.log('Succesfully connected.')
})


0

To zadziała:

// Connect to Mongo
mongoose.set("useNewUrlParser", true);
mongoose.set("useUnifiedTopology", true);

mongoose
  .connect(db) // Connection String here
  .then(() => console.log("MongoDB Connected..."))
  .catch(() => console.log(err));

0
const url = 'mongodb://localhost:27017';
const client = new MongoClient(url);

Wytnij górną drugą linię, a następnie po prostu zastąp tę linię

const client = new MongoClient(url, { useUnifiedTopology: true });

0

To działa dobrze dla mnie i nie ma więcej błędów.

mongoose
.connect(URL_of_mongodb, {
useUnifiedTopology: true,
useNewUrlParser: true,
})
.then(() => console.log('DB Connected!'))
.catch(err => {
console.log(`DB Connection Error: ${err}`);
});

Dodaj wyjaśnienie do swojej odpowiedzi! Nie zapomnij też sprawdzić: Jak napisać dobrą odpowiedź?
Prathamesh Koshti

0

działający przykładowy kod dla mongo, link referencyjny

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url,{ useUnifiedTopology: true }, function(err, db) {
  if (err) throw err;
  var dbo = db.db("mydb");
  dbo.createCollection("customers", function(err, res) {
    if (err) throw err;
    console.log("Collection created!");
    db.close();
  });
});
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.