restful nodejs node framework example node.js mongodb mongoose restify pm2

node.js - nodejs - node js rest api framework



mongoError: la topología fue destruida (16)

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

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

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

Tengo un servicio REST integrado en node.js con Restify y Mongoose y un mongoDB con una colección con aproximadamente 30,000 documentos de tamaño regular. Tengo mi servicio de nodo ejecutándose a través de pmx y pm2.

Ayer, de repente, el nodo comenzó a eliminar errores con el mensaje "MongoError: se destruyó la topología", nada más. No tengo idea de qué se entiende por esto y qué podría haber provocado esto. tampoco hay mucho que encontrar al buscar en google esto. Así que pensé en preguntar aquí.

Después de reiniciar el servicio de nodo hoy, los errores dejaron de aparecer. También tengo uno de estos ejecutándose en producción y me da miedo que esto pueda suceder en cualquier momento en una parte crucial de la configuración que se ejecuta allí ...

Estoy usando las siguientes versiones de los paquetes mencionados:

  • mangosta: 4.0.3
  • restify: 3.0.3
  • nodo: 0.10.25

Aquí lo que hice, funciona bien. El problema desapareció después de agregar las siguientes opciones.

const dbUrl = "mongodb://localhost:27017/sampledb"; const options = { useMongoClient: true, keepAlive: 1, connectTimeoutMS: 30000, reconnectTries: 30, reconnectInterval: 5000, useNewUrlParser: true } mongoose.connect(dbUrl,options, function( error ) { if (error) { console.log("mongoerror", error); } else { console.log("connected"); } });


Debe ir al menú " Conectar " y hacer clic en el submenú " Conectar a ... ". Esto abrirá una nueva ventana de MongoDB Compass Community , a través de la cual puede conectarse nuevamente.


Debe reiniciar mongo para resolver el error de topología, luego simplemente cambie algunas opciones de mongoose o mongoclient para superar este problema:

var mongoOptions = { useMongoClient: true, keepAlive: 1, connectTimeoutMS: 30000, reconnectTries: Number.MAX_VALUE, reconnectInterval: 5000, useNewUrlParser: true } mongoose.connect(mongoDevString,mongoOptions);


El comentario de Sebastian sobre la respuesta de Adrien necesita más atención, me ayudó, pero al ser un comentario podría ser ignorado en algún momento, así que aquí hay una solución :

var options = { useMongoClient: true, keepAlive: 1, connectTimeoutMS: 30000, reconnectTries: 30, reconnectInterval: 5000 } mongoose.connect(config.mongoConnectionString, options, (err) => { if(err) { console.error("Error while connecting", err); } });


En mi caso, este error fue causado por un db.close(); fuera de una sección de ''espera'' dentro de ''asíncrono''

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 mostró nada como ''algo está usando el puerto xxx''. Incluso podría subir algo al servidor. Entonces, me llevó 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 utiliza 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, descubrí que el número de puerto en el monitor es diferente del que usa mi servidor.

Con todo, matar todos los procesos de nodo puede resolver este problema directamente.


Este error se debe a que el controlador mongo desconectó la conexión por cualquier motivo (por ejemplo, el servidor no funcionaba).

Por defecto, mangosta intentará reconectarse durante 30 segundos, luego dejará de volver a intentarlo y arrojará 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


Estuve luchando con esto durante algún tiempo. Como puede ver en otras respuestas, el problema puede ser muy diferente.

La forma más fácil de averiguar cuál es la causa es activar loggingLevel: info en las opciones


Lo conocí en kubernetes / minikube + nodejs + mongoose. El problema era que el servicio DNS estaba funcionando con una especie de latencia. Verificar 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 };

(los números en db_options se encuentran arbitrariamente en y sitios similares)


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

Echa 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 Velas citado en los comentarios, ya que no se instalaron actualizaciones para precipitar el bloqueo o la "solución"


Recibí este error, mientras creaba una nueva base de datos en mi Comunidad MongoDb Compass. El problema era con mi Mongod, no se estaba ejecutando. Entonces, como una 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.


Resolví este problema de la siguiente manera:

  1. asegurando que mongo esté funcionando
  2. reiniciar mi servidor

Sé que la respuesta de Jason fue aceptada, pero tuve el mismo problema con Mongoose y descubrí que el servicio que alojaba mi base de datos me recomendaba aplicar las siguientes configuraciones para mantener viva la conexión de Mongodb en 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 tienen errores de "Se destruyó la topología".


Solo una pequeña adición a la respuesta de Gaafar, me dio una advertencia de desaprobació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 colóquelo en el objeto de opciones como este:

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


También tuve el mismo error. Finalmente, descubrí que tengo algún error en mi código. Utilizo el equilibrio de carga para dos servidores nodejs, pero acabo de actualizar el código de un servidor.

Cambio mi servidor mongod from standalone to replication , pero olvido 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: mongodb://server-1:27017,server-2:27017,server-3:27017/mydb?replicaSet=myReplSet

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