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

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 была проблема, и они исправили эту ошибку в более поздних версиях. Таким образом, вы можете решить проблему, обновив версию мангуста.

iLiA
источник

Ответы:

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});
Codemaker
источник
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);
    });  

}});

StarDrop9
источник
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});
Prateek Gowda
источник
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,
};
Mohammed_Alreai
источник
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