Механизм обнаружения и мониторинга серверов устарел


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 {Boolean} [options.useUnifiedTopology = false] По умолчанию - false. Установите, чтобы trueвыбрать набор реплик драйвера MongoDB и механизм мониторинга сегментированного кластера.

В проекте GitHub также есть проблема с этой ошибкой: https://github.com/Automattic/mongoose/issues/8156

В моем случае я не использую Mongoose в наборе реплик или сегментированном кластере, хотя этот параметр должен быть false. Но если false, он жалуется, настройка должна быть верной. Когда это правда, это все равно не работает, вероятно, потому, что моя база данных не работает в наборе реплик или сегментированном кластере.

Я понизил версию до 5.6.13, и мой проект снова работает нормально. Так что единственный вариант, который я вижу на данный момент, - это понизить его и дождаться обновления исправления для новой версии.


Я думал то же самое (версия с более ранней версией), я использую кластеры mlab, так что, может быть, это причина, по которой предупреждение не исчезает?
iLiA

2
в последней версии mongoose есть ошибка, 5.7.7если вы используете createConnection()вместо connect(), как mongoose.createConnection(conString, { useUnifiedTopology: true }). useUnifiedTopologyне будут приняты во внимание, и вы все равно получите предупреждение. событие, при котором mongoose.set('useUnifiedTopology', true)я все еще получаю предупреждение.
Луи

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 (err)}) вот что сработало для меня
Sanket Sonavane

9

Это решило мою проблему.

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

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

спасибо за ответ, но это вопрос мангуста, и я не использую mongoclient
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: текущий синтаксический анализатор строки URL устарел и будет удален в будущей версии. Чтобы использовать новый синтаксический анализатор, передайте параметр {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 } }));
Гаэль Мусикингала,

@GaelMusikingala, это была моя проблема. Спасибо, что указали на это
akmalhakimi1991

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

  1. Текущий синтаксический анализатор строки URL устарел и будет удален в будущей версии. Чтобы использовать новый синтаксический анализатор, передайте параметр {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

Настройка mongoose connect 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>

В этом случае не забудьте заменить пароль на пароль вашей базы данных и имя базы данных, а затем использовать

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.