El motor de detección y supervisión de servidores está obsoleto

96

Estoy usando Mongoose con mi aplicación Node.js y esta es mi configuración:

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

pero en la consola todavía me da la advertencia:

DeprecationWarning: el motor actual de detección y supervisión de servidores está en desuso y se eliminará en una versión futura. Para usar el nuevo motor Server Discover and Monitoring, pase la opción {useUnifiedTopology: true} al constructor MongoClient.

¿Cuál es el problema? No estaba usando useUnifiedTopologyantes, pero ahora aparece en la consola. Lo agregué a la configuración pero todavía me da esta advertencia, ¿por qué? Ni siquiera lo uso MongoClient.

Editar

Como respondió Felipe Plets, había un problema en Mongoose y solucionaron este error en versiones posteriores. Para que pueda resolver el problema actualizando la versión de mangosta.

iLiA
fuente

Respuestas:

170

Actualizar

Mongoose 5.7.1 se lanzó y parece solucionar el problema, por lo que configurar la useUnifiedTopologyopción funciona como se esperaba.

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

Respuesta original

Estaba enfrentando el mismo problema y decidí profundizar en el código de Mongoose: https://github.com/Automattic/mongoose/search?q=useUnifiedTopology&unscoped_q=useUnifiedTopology

Parece ser una opción agregada en la versión 5.7 de Mongoose y aún no está bien documentada. Ni siquiera pude encontrarlo mencionado en el historial de la biblioteca https://github.com/Automattic/mongoose/blob/master/History.md

Según un comentario en el código:

  • @param {Boolean} [options.useUnifiedTopology = false] Falso por defecto. Establecer a truede optar por conjunto de réplicas del conductor MongoDB y el grupo fragmentados motor de monitorización.

También hay un problema en el proyecto GitHub sobre este error: https://github.com/Automattic/mongoose/issues/8156

En mi caso, no uso Mongoose en un conjunto de réplicas o clúster fragmentado y, aunque la opción debería ser falsa. Pero si es falso, se queja de que la configuración debería ser verdadera. Una vez que es cierto, todavía no funciona, probablemente porque mi base de datos no se ejecuta en un conjunto de réplicas o un clúster fragmentado.

He bajado a 5.6.13 y mi proyecto está funcionando bien. Entonces, la única opción que veo por ahora es degradarlo y esperar a que la solución se actualice para una versión más nueva.

Felipe Plets
fuente
Pensé lo mismo (versión degradada), estoy usando clústeres mlab, así que tal vez sea la razón por la que la advertencia no desaparece.
iLiA
2
hay un error en la última mangosta 5.7.7si usa en createConnection()lugar de connect(), como mongoose.createConnection(conString, { useUnifiedTopology: true }). useUnifiedTopologyno se tomará en consideración y seguirá recibiendo la advertencia. evento con mongoose.set('useUnifiedTopology', true)sigo recibiendo la advertencia.
Louis Grellet
2
La advertencia aún persiste después de rebajar a 5.6.13
O'Dane Brissett
1
¡Recibo ese error al usar el controlador nativo de MongoDB!
Akhila
Aquí tenemos todas las opciones obsoletas: mongoosejs.com/docs/deprecations.html
Murtaza Ahmad
27

En mongoDB, desaprobaron el paquete actual de monitoreo de servidor y motor, por lo que debe usar un nuevo paquete de monitoreo de servidor y motor. Así que solo usa

{useUnifiedTopology: true}

mongoose.connect("paste db link", {useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true });
tamilselvan s
fuente
11
Si lees mi pregunta, mencioné allí que agregué useUnifiedTopology: trueen mi configuración y todavía me muestra una advertencia
iLiA
4
Tuve este problema y también agregué, useUnifiedTopology: truepero sigue apareciendo el mismo mensaje en la consola.
RSA
6
Para cualquiera que reciba el mensaje, intente llamar mongoose.set('useUnifiedTopology', true)antes de mongoose.connect.
dev4life
Si, esta es la respuesta correcta. Solo tiene que poner "useUnifiedTopology: true, useNewUrlParser: true" juntos dentro de un par de {}. Sin embargo, no usé "useCreateIndex: true", pero me da una idea. La forma de dev4life también funciona.
William Hou
mongoose .connect ("db conn url", {useUnifiedTopology: true, useNewUrlParser: true,}) .then (() => console.log ('MongoDB Connected!')) .catch (err => {err => console .log (err)}) esto es lo que funcionó para mí
Sanket Sonavane
9

Esto resolvió mi problema.

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

 const client = new MongoClient(url, {useUnifiedTopology: true});
Юрий Светлов
fuente
gracias por la respuesta, pero esta es una pregunta de mangosta, y no estoy usando mongoclient
iLiA
3
@iLiA De nada. Sí, lo sé. Pero esta respuesta puede ser de ayuda para alguien, ya que encontré su pregunta exactamente por el tema del título y no por el contenido (y el contenido de su pregunta está muy cerca de la información general sobre MongoClient)
Юрий Светлов
3

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

Niran Yousuf
fuente
Use {useUnifiedTopology: true}
Niran Yousuf
3

Utilice el siguiente código para evitar ese error

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

Eliminará los siguientes errores: -

(nodo: 7481) DeprecationWarning: el analizador de cadenas de URL actual está obsoleto y se eliminará en una versión futura. Para usar el nuevo analizador, pase la opción {useNewUrlParser: true} a MongoClient.connect.

(nodo: 7481) DeprecationWarning: el motor actual de detección y supervisión de servidores está obsoleto y se eliminará en una versión futura. Para usar el nuevo motor Server Discover and Monitoring, pase la opción {useUnifiedTopology: true} al constructor MongoClient.

Hassan Ali Shahzad
fuente
3
También asegúrese de agregar useUnifiedTopology: truea todas las dependencias que usa mongoDB, en mi caso estaba usandowiston-mongodb , tuve que agregarlo en la opción también winston.add(new winston.transports.MongoDB({ db: config.get('db'), options: { useUnifiedTopology: true } }));
Gael Musikingala
@GaelMusikingala este era mi problema. Gracias por señalar eso
akmalhakimi1991
@GaelMusikingala, Gracias por salvarme la vida. ❤️ 👏
Mr.spShuvo
@ Mr.spShuvo por favor upvote
Hassan Ali Shahzad
2

Agregue la opción useUnifiedTopology y establézcala en true .

Establezca otras 3 configuraciones de las opciones de mongoose.connect que se ocuparán de otras DeprecationWarning restantes .

¡Esta configuración me funciona!

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

Esto resolverá 4 DeprecationWarning .

  1. El analizador de cadenas de URL actual está obsoleto y se eliminará en una versión futura. Para usar el nuevo analizador, pase la opción {useNewUrlParser: true} a MongoClient.connect.
  2. El motor actual de detección y supervisión de servidores está obsoleto y se eliminará en una versión futura. Para usar el nuevo motor Server Discover and Monitoring, pase la opción {useUnifiedTopology: true} al constructor MongoClient.
  3. Collection.ensureIndex está en desuso. En su lugar, utilice createIndexes.
  4. Advertencia: Mangosta: findOneAndUpdate() yfindOneAndDelete() sin la useFindAndModifyopción establecida en false están en desuso. Ver: https://mongoosejs.com/docs/deprecations.html#-findandmodify- .

Espero eso ayude.

Richard Vergis
fuente
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);
});
Alok Srivastav
fuente
1

Si su código incluye createConnetion por alguna razón (en mi caso estoy usando GridFsStorage), intente agregar lo siguiente a su código:

    options: {
        useUnifiedTopology: true,
    }

justo después del archivo, así:

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

Si su caso se parece al mío, esto seguramente resolverá su problema. Saludos

mohamad b
fuente
0

También me enfrentaba al mismo problema:

  1. Me aseguré de estar conectado a mongoDB ejecutando lo siguiente en la terminal:

    brew services start mongodb-community@4.2
    

    Y obtuve el resultado:

    Successfully started `mongodb-community`
    

Instrucciones para instalar mongodb en
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/ o https://www.youtube.com/watch?v=IGIcrMTtjoU

  1. Mi configuración fue la siguiente:

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

¡Lo que resolvió mi problema!

Miguel Chiau
fuente
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
fuente
0

Configuración de mongoose connect useUnifiedTopology: opción verdadera

  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();
Sanjay kumar
fuente
0

Quiero agregar a este hilo que también puede tener que ver con otras dependencias.

Por ejemplo, nada de lo que actualicé o configuré para NodeJS, MongoDB o Mongoose fue el problema, sin embargo, connect-mongodb-sessionse actualizó y comenzó a lanzar el mismo error. La solución, en este caso, fue simplemente revertir la versión de connect-mongodb-sessionde una versión 2.3.0a otra 2.2.0.

ingrese la descripción de la imagen aquí

Steven Ventimiglia
fuente
0

Tuve los mismos errores apareciendo cada vez y esto funcionó para mí

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

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

usa esta línea, esto funcionó para mí

mongoose.set('useUnifiedTopology', true);
Sunil Sahu
fuente
1
Cuando sea posible, haga un esfuerzo por proporcionar una explicación adicional en lugar de solo el código. Estas respuestas tienden a ser más útiles ya que ayudan a los miembros de la comunidad y especialmente a los nuevos desarrolladores a comprender mejor el razonamiento de la solución y pueden ayudar a prevenir la necesidad de abordar preguntas de seguimiento.
Rajan
0

Si está utilizando un servidor MongoDB, luego de usar connect en el reloj del clúster al conectarse y encontrar la URL, la URL será algo así

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

En este caso, no olvide reemplazar la contraseña con la contraseña de su base de datos y el nombre de la base de datos y luego use

const client = new MongoClient(url,{useUnifiedTopology:true});
Rohan Devaki
fuente
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));
    }
});
kiran r
fuente
Cuando sea posible, haga un esfuerzo por proporcionar una explicación adicional en lugar de solo el código. Estas respuestas tienden a ser más útiles ya que ayudan a los miembros de la comunidad y especialmente a los nuevos desarrolladores a comprender mejor el razonamiento de la solución y pueden ayudar a prevenir la necesidad de abordar preguntas de seguimiento.
Rajan
0

Es simple, elimine el código que ha usado y use el siguiente código:

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

si usó mecanografiado agregue config a 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
fuente
0

Es importante ejecutar su comando mongod y mantener el servidor en funcionamiento. De lo contrario, seguirá viendo este error.

Te adjunto mi codigo:

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

licencia
fuente
0

Esto funcionará:

// 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));
Chamon Roy
fuente
-1

Esto funcionó para mi

Para las personas que usan, MongoClientpruebe esto:

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

Para mangosta:

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

Eliminar otras opciones de conexión

shetkar vinayak
fuente
1
Admití que no estoy usando mongoClient
iLiA