Система виявлення та моніторингу сервера застаріла


96

Я використовую Mongoose зі своїм додатком Node.js, і це моя конфігурація:

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

але в консолі він все одно дає мені попередження:

DeprecationWarning: поточний механізм виявлення та моніторингу сервера застарілий і буде вилучений у наступній версії. Щоб використовувати новий механізм виявлення та моніторингу сервера, передайте опцію {useUnifiedTopology: true} конструктору MongoClient.

В чому проблема? useUnifiedTopologyРаніше я не використовував, але зараз це відображається в консолі. Я додав його до конфігурації, але він все одно дає мені це попередження, чому? Навіть не користуюсь MongoClient.

Редагувати

Як відповів Феліпе Плец, у Mongoose була проблема, і вони виправили цю помилку в пізніших версіях. Тож ви можете вирішити проблему, оновивши мангустську версію.

Відповіді:


170

Оновлення

Випущено Mongoose 5.7.1, який, здається, виправляє проблему, тому налаштування useUnifiedTopologyопції працює належним чином.

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

Оригінальна відповідь

Я зіткнувся з тією ж проблемою і вирішив глибоко зануритися в код Mongoose: https://github.com/Automattic/mongoose/search?q=useUnifiedTopology&unscoped_q=useUnifiedTopology

Здається, це опція, додана у версії 5.7 Mongoose і ще недостатньо задокументована. Я навіть не зміг знайти це, згадане в історії бібліотеки https://github.com/Automattic/mongoose/blob/master/History.md

Відповідно до коментаря в коді:

  • @param {логічний} [options.useUnifiedTopology = false] За замовчуванням помилковий. Встановити для trueвибору набору реплік драйвера MongoDB та механізму моніторингу кластерного кластера.

У проекті GitHub також є проблема щодо цієї помилки: https://github.com/Automattic/mongoose/issues/8156

У моєму випадку я не використовую Mongoose у наборі реплік або шардованому кластері, і хоча параметр повинен бути хибним. Але якщо false, він скаржиться, що налаштування має бути істинним. Після того, як це правда, він все одно не працює, можливо, тому, що моя база даних не працює на наборі репліках або шардованому кластері.

Я знизився до версії 5.6.13, і мій проект знову працює нормально. Отже, єдиним варіантом, який я бачу зараз, є зниження його версії та очікування оновлення виправлення для нової версії.


я думав так само (версія попередньої версії), я використовую mlab-кластери, тому, можливо, причина, через яку попередження не зникає?
iLiA

2
є помилка в останньому мангусті, 5.7.7якщо ви використовуєте createConnection()замість connect(), наприклад mongoose.createConnection(conString, { useUnifiedTopology: true }). useUnifiedTopologyне враховуватиметься, і ви все одно отримаєте попередження. подія з mongoose.set('useUnifiedTopology', true)я все ще отримую попередження.
Louis Grellet

2
Попередження все ще зберігається після зниження версії до 5.6.13
О'Дейн Бріссетт,

1
Я отримую цю помилку з використанням власного драйвера MongoDB!
Ахіла

Тут ми маємо всі застарілі варіанти: mongoosejs.com/docs/deprecations.html
Муртаза Ахмад,

27

У mongoDB вони застаріли поточний пакет моніторингу сервера та двигуна, тому вам потрібно використовувати новий пакет моніторингу серверів та двигуна. Отже, ви просто використовуєте

{useUnifiedTopology: true}

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

11
якщо ви прочитали моє запитання, я там згадав, що додав useUnifiedTopology: trueу свою конфігурацію, і все ще відображається попередження
iLiA

4
У мене була ця проблема, і я також додаю, useUnifiedTopology: trueале все одно те саме повідомлення надходить на консоль.
RSA,

6
Якщо хтось отримує повідомлення, спробуйте зателефонувати mongoose.set('useUnifiedTopology', true)перед mongoose.connect.
dev4life

Так, це правильна відповідь. Вам просто потрібно поєднати "useUnifiedTopology: true, useNewUrlParser: true" разом у парі {}. Хоча я не використовував "useCreateIndex: true", але це дає мені певне уявлення. Спосіб dev4life також працює.
Вільям Хоу

mongoose .connect ("db conn url", {useUnifiedTopology: true, useNewUrlParser: true,}). then (() => console.log ('MongoDB Connected!')) .catch (err => {err => console .log (помилка)}) ось що в мене спрацювало
Санкет Сонаване

9

Це вирішило мою проблему.

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

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

дякую за відповідь, але це питання мангуста, і я не використовую монгоклієнт
iLiA

3
@iLiA Ласкаво просимо. Так, я знаю. Але ця відповідь може комусь допомогти, оскільки я знайшов ваше запитання саме за темою заголовка, а не за змістом (а зміст вашого запитання дуже близький до загальної інформації про MongoClient)
Юрий Светлов

3

Ви можете спробувати async await

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


Використовуйте {useUnifiedTopology: true}
Ніран Юсуф

3

Використовуйте наступний код, щоб уникнути цієї помилки

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

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

Видалить наступні помилки: -

(вузол: 7481) DeprecationWarning: поточний синтаксичний аналізатор рядків застарілий і буде видалений у наступній версії. Щоб використовувати новий синтаксичний аналізатор, передайте опцію {useNewUrlParser: true} MongoClient.connect.

(вузол: 7481) DeprecationWarning: поточний механізм виявлення та моніторингу сервера застарілий і буде вилучений у наступній версії. Щоб використовувати новий механізм виявлення та моніторингу сервера, передайте опцію {useUnifiedTopology: true} конструктору MongoClient.


3
Також не забудьте додати useUnifiedTopology: trueдо всіх залежностей, що використовує mongoDB, у моєму випадку, який я використовував, wiston-mongodbмені також довелося додати його в опцію winston.add(new winston.transports.MongoDB({ db: config.get('db'), options: { useUnifiedTopology: true } }));
Gael Musikingala

@GaelMusikingala це була моя проблема. Дякуємо, що
вказали на це

@GaelMusikingala, Дякуємо, що врятували мені життя. ❤️ 👏
Mr.spShuvo

@ Mr.spShuvo, будь ласка, проголосуйте
Хасан Алі Шахзад,

2

Додайте опцію useUnifiedTopology і встановіть для неї значення true .

Встановіть інші 3 конфігурації опцій mongoose.connect , які будуть мати справу з іншими залишками DeprecationWarning .

Ця конфігурація працює для мене!

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

Це вирішить 4 Попередження про припинення використання .

  1. Поточний синтаксичний аналізатор рядків застарів та буде вилучений у наступній версії. Щоб використовувати новий синтаксичний аналізатор, передайте опцію {useNewUrlParser: true} MongoClient.connect.
  2. Поточний механізм виявлення та моніторингу сервера застарів та буде вилучений у наступній версії. Щоб використовувати новий механізм виявлення та моніторингу сервера, передайте опцію {useUnifiedTopology: true} конструктору MongoClient.
  3. Collection.ensureIndex застаріло. Замість цього використовуйте createIndexes.
  4. DeprecationWarning: Mongoose: findOneAndUpdate()і findOneAndDelete()без useFindAndModifyпараметра, встановленого на false, застаріли. Див .: https://mongoosejs.com/docs/deprecations.html#-findandmodify- .

Сподіваюся, це допоможе.


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

Якщо ваш код з якоїсь причини включає createConnetion (у моєму випадку я використовую GridFsStorage), спробуйте додати до свого коду наступне:

    options: {
        useUnifiedTopology: true,
    }

відразу після файлу, наприклад:

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

Якщо ваша справа схожа на мою, це, безсумнівно, вирішить вашу проблему. З повагою


0

Я також стикався з тим самим питанням:

  1. Я переконався, що підключений до mongoDB, запустивши на терміналі таке:

    brew services start mongodb-community@4.2
    

    І я отримав результат:

    Successfully started `mongodb-community`
    

Інструкції з встановлення mongodb на
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/ або https://www.youtube.com/watch?v=IGIcrMTtjoU

  1. Моя конфігурація була такою:

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

Що вирішило мою проблему!


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

Налаштування підключення мангуста useUnifiedTopology: параметр 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

Я хочу додати до цього потоку, що це, можливо, пов'язано з іншими залежностями.

Наприклад, нічого, що я не оновлював і не встановлював для NodeJS, MongoDB або Mongoose, не було проблемою - однак - connect-mongodb-sessionбуло оновлено і почалося стропування тієї ж помилки. Рішенням, у цьому випадку, було просто відкат версії connect-mongodb-sessionз версії 2.3.0на 2.2.0.

введіть тут опис зображення


0

у мене щоразу виникали однакові помилки, і це спрацьовувало на мене

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

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

0

використовуйте цей рядок, це у мене спрацювало

mongoose.set('useUnifiedTopology', true);

1
Коли це можливо, докладіть зусиль, щоб надати додаткові пояснення замість просто коду. Такі відповіді, як правило, є більш корисними, оскільки вони допомагають членам спільноти та особливо новим розробникам краще зрозуміти аргументи рішення та можуть допомогти уникнути необхідності вирішувати подальші питання.
Раджан

0

Якщо ви використовуєте сервер MongoDB, то після використання з'єднання в годиннику кластера при підключенні та пошуку URL-адреси, URL-адреса буде виглядати приблизно так

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

У цьому випадку не забудьте замінити пароль паролем бази даних та ім’ям db, а потім використайте

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

Коли це можливо, докладіть зусиль, щоб надати додаткові пояснення замість просто коду. Такі відповіді, як правило, є більш корисними, оскільки вони допомагають членам спільноти та особливо новим розробникам краще зрозуміти аргументи рішення та можуть допомогти уникнути необхідності вирішувати подальші питання.
Раджан

0

Це просто, видаліть код, який ви використовували, і скористайтеся наведеним нижче кодом:

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

0

якщо ви використовували машинопис, додайте конфігурацію до 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

Важливо запустити команду mongod і підтримувати роботу сервера. Якщо ні, ви все одно побачите цю помилку.

Я додаю вам свій код:

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

Це буде працювати:

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

-1

Це спрацювало для мене

Для людей, які використовують MongoClientспробуйте:

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

Для мангуста:

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

Видаліть інші варіанти підключення


1
Я визнав, що не використовую mongoClient
iLiA
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.