mongoError: la topología fue destruida

Tengo un servicio REST construido en node.js con Restify and Mongoose y un mongoDB con una colección de aproximadamente 30.000 documentos de tamaño normal. Tengo mi servicio de nodo ejecutándose a través de pmx y pm2.

Ayer, de repente, el nodo comenzó a generar errores con el mensaje “MongoError: Topology was destroyed”, nada más. No tengo idea de qué se entiende por esto y qué podría haber desencadenado esto. tampoco hay mucho que encontrar cuando google-searching this. Así que pensé en preguntar aquí.

Después de reiniciar el servicio de nodo hoy, los errores dejaron de llegar. También tengo uno de estos funcionando en producción y me asusta que esto pueda suceder en un momento dado a una parte bastante crucial de la configuración que se está ejecutando allí …

Estoy usando las siguientes versiones de los paquetes mencionados:

Parece significar que la conexión de su servidor de nodo a su instancia de MongoDB se interrumpió mientras intentaba escribir en ella.

Eche un vistazo al código fuente de Mongo que genera ese error

Mongos.prototype.insert = function(ns, ops, options, callback) { if(typeof options == 'function') callback = options, options = {}; if(this.s.state == DESTROYED) return callback(new MongoError(f('topology was destroyed'))); // Topology is not connected, save the call in the provided store to be // Executed at some point when the handler deems it's reconnected if(!this.isConnected() && this.s.disconnectHandler != null) { callback = bindToCurrentDomain(callback); return this.s.disconnectHandler.add('insert', ns, ops, options, callback); } executeWriteOperation(this.s, 'insert', ns, ops, options, callback); } 

Esto no parece estar relacionado con el problema de Sails citado en los comentarios, ya que no se instalaron actualizaciones para precipitar el locking o el “arreglo”.

Sé que la respuesta de Jason fue aceptada, pero tuve el mismo problema con Mongoose y descubrí que el servicio que hospedaba mi base de datos recomendaba aplicar las siguientes configuraciones para mantener viva la conexión de Mongodb en la producción:

 var options = { server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }, replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } } }; mongoose.connect(secrets.db, options); 

Espero que esta respuesta pueda ayudar a otras personas que tengan errores de “Topología destruida”.

Este error se debe a que el controlador de mongo ha abandonado la conexión por algún motivo (el servidor estaba inactivo, por ejemplo).

Por defecto, mongoose intentará volver a conectarse durante 30 segundos y luego dejar de reintentar y lanzar errores para siempre hasta que se reinicie.

Puede cambiar esto editando estos 2 campos en las opciones de conexión

 mongoose.connect(uri, { server: { // sets how many times to try reconnecting reconnectTries: Number.MAX_VALUE, // sets the delay between every retry (milliseconds) reconnectInterval: 1000 } } ); 

documentación de opciones de conexión

Solo una pequeña adición a la respuesta de Gaafar, me dio una advertencia de depreciación. En lugar de en el objeto del servidor, así:

 MongoClient.connect(MONGO_URL, { server: { reconnectTries: Number.MAX_VALUE, reconnectInterval: 1000 } }); 

Puede ir en el objeto de nivel superior. Básicamente, simplemente sáquelo del objeto del servidor y póngalo en el objeto de opciones de esta manera:

 MongoClient.connect(MONGO_URL, { reconnectTries: Number.MAX_VALUE, reconnectInterval: 1000 }); 

Además, tuve el mismo error. Finalmente, descubrí que tengo un error en mi código. Utilizo el balance de carga para dos servidores nodejs, pero solo actualizo el código de un servidor.

Cambio mi servidor mongod from standalone to replication , pero olvidé hacer la actualización correspondiente para la cadena de conexión, así que me encontré con este error.

cadena de conexión independiente: mongodb://server-1:27017/mydb cadena de conexión de replicación de mongodb://server-1:27017/mydb : mongodb://server-1:27017,server-2:27017,server-3:27017/mydb?replicaSet=myReplSet

detalles aquí: [mongo doc para cadena de conexión]

La “topología fue destruida” podría ser causada por la desconexión de la mongoose antes de que se creen los índices de documentos mongo, según este comentario

Para asegurarse de que todos los modelos tienen sus índices construidos antes de desconectarse, puede:

 await Promise.all(mongoose.modelNames().map(model => mongoose.model(model).ensureIndexes())); await mongoose.disconnect(); 

Conocí esto en el entorno kubernetes / minikube + nodejs + mongoose. El problema era que el servicio de DNS estaba en una especie de latencia. Comprobando el DNS está listo resolvió mi problema.

 const dns = require('dns'); var dnsTimer = setInterval(() => { dns.lookup('mongo-0.mongo', (err, address, family) => { if (err) { console.log('DNS LOOKUP ERR', err.code ? err.code : err); } else { console.log('DNS LOOKUP: %j family: IPv%s', address, family); clearTimeout(dnsTimer); mongoose.connect(mongoURL, db_options); } }); }, 3000); var db = mongoose.connection; var db_options = { autoReconnect:true, poolSize: 20, socketTimeoutMS: 480000, keepAlive: 300000, keepAliveInitialDelay : 300000, connectTimeoutMS: 30000, reconnectTries: Number.MAX_VALUE, reconnectInterval: 1000, useNewUrlParser: true }; 

Obtuve este error mientras creaba una nueva base de datos en mi comunidad MongoDb Compass. El problema era con mi Mongod, no estaba funcionando. Entonces, como solución, tuve que ejecutar el comando Mongod como precedente.

 C:\Program Files\MongoDB\Server\3.6\bin>mongod 

Pude crear una base de datos después de ejecutar ese comando.

Espero eso ayude.

En mi caso, este error fue causado por un db.close(); fuera de una sección ‘aguardar’ dentro de ‘async’

 MongoClient.connect(url, {poolSize: 10, reconnectTries: Number.MAX_VALUE, reconnectInterval: 1000}, function(err, db) { // Validate the connection to Mongo assert.equal(null, err); // Query the SQL table querySQL() .then(function (result) { console.log('Print results SQL'); console.log(result); if(result.length > 0){ processArray(db, result) .then(function (result) { console.log('Res'); console.log(result); }) .catch(function (err) { console.log('Err'); console.log(err); }) } else { console.log('Nothing to show in MySQL'); } }) .catch(function (err) { console.log(err); }); db.close(); // <--------------------------------THIS LINE }); 

En mi caso, este error fue causado por una instancia de servidor idéntica que ya ejecutaba el fondo.

Lo extraño es que cuando inicié mi servidor sin previo aviso ya hay uno ejecutándose, la consola no muestra nada como ‘algo está usando el puerto xxx’. Incluso podría subir algo al servidor. Entonces, me tomó bastante tiempo localizar este problema.

Además, después de cerrar todas las aplicaciones que puedo imaginar, todavía no pude encontrar el proceso que está utilizando este puerto en el monitor de actividad de mi Mac. Tengo que usar lsof para rastrear. El culpable no fue sorprendente, es un proceso de nodo. Sin embargo, con el PID que se muestra en el terminal, encontré que el número de puerto en el monitor es diferente al utilizado por mi servidor.

En general, matar a todos los procesos de nodo puede resolver este problema directamente.

Resolví este problema por:

  1. asegurando que mongo se está ejecutando
  2. reiniciar mi servidor

Debe ir al menú ” Conectar ” y hacer clic en el submenú ” Conectar a … “. Esto abrirá una nueva ventana Comunidad MongoDB Compass , a través de la cual puede conectarse de nuevo.