2012-01-11 15 views
78

Estoy usando mangosta en un script que no debe ejecutarse continuamente, y estoy enfrentando lo que parece ser un problema muy simple pero no puedo encontrar una respuesta; simplemente pongo una vez que hago una llamada a cualquier función de mangosta que envía solicitudes a mongodb. Mi instancia de nodejs nunca se detiene y tengo que matarla manualmente con, por ejemplo, Ctrl + c o Program.exit().Correctamente cierre la conexión de mangosta una vez que haya terminado

El código es más o menos así:

var mongoose = require('mongoose'); 

// if my program ends after this line, it shuts down as expected, my guess is that the connection is not really done here but only on the first real request ? 
mongoose.connect('mongodb://localhost:27017/somedb'); 

// define some models 

// if I include this line for example, node never stop afterwards 
var MyModel = mongoose.model('MyModel', MySchema); 

He intentado añadir llamadas a mongoose.disconnect(), pero no a consecuencia de ello. Aparte de eso, todo funciona bien (encontrar, guardar, ...).

Este es el problema exactamente el mismo como esta persona, por desgracia, no recibió ninguna respuesta: https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

Gracias

EDIT: aceptado la respuesta a continuación, ya que es técnicamente correcto, pero si alguien alguna vez ir a este problema de nuevo, parece que mangosta y/o el controlador mongodb en realidad no cierra la conexión cuando se le pregunta si todavía hay consultas en ejecución.

Ni siquiera recuerda la llamada de desconexión en absoluto, no lo hace una vez que las consultas han terminado de ejecutarse; simplemente descarta su llamada sin excepción ni nada por el estilo, y nunca cierra la conexión.

Así que ahí lo tienes: asegúrate de que cada consulta haya sido procesada antes de llamar a desconectar() si quieres que funcione realmente.

+0

¿Hay alguna manera de hacer esto solo importando un modelo? ninguna de las respuestas siguientes funciona: \ – Antoine

Respuesta

128

Puede cerrar la conexión con

mongoose.connection.close() 
+14

Esto de hecho cierra la conexión. Sin embargo, esta llamada fue borrar los contenidos en mi base de datos. Cuando cambié a mongoose.disconnect() todo funcionó correctamente y mis pruebas de mocha comenzaron a funcionar correctamente otra vez –

+1

Esto funcionó para mí. Solo necesitaba asegurarme de colocar esto en la devolución de llamada correcta, o de lo contrario, probablemente estaba cerrando la conexión antes de guardarla en la base de datos. Para ser justos, todavía estoy usando un script simple que solo se conecta al DB local y guarda un simple objeto de usuario de ejemplo. En la devolución de llamada a user.save() es donde llamo mongoose.connection.close(). – FateNuller

+0

Como puede ver, estas respuestas son antiguas. Si está utilizando _Mongoose 5.0.4_, [el método 'Connection.close()'] (http://mongoosejs.com/docs/api.html#connection_Connection-close) solo se exporta, solo está disponible, así que úselo . –

40

La otra respuesta no funcionó para mí. Tuve que usar mongoose.disconnect(); como se indica en this answer.

+0

Esto también se prefiere cuando se destruye un entorno de prueba. –

+0

mongoose.disconnect() es mejor usar y un enfoque lógico. –

8

Puede configurar la conexión a una variable y luego desconectarlo cuando haya terminado:

var db = mongoose.connect('mongodb://localhost:27017/somedb'); 

// Do some stuff 

db.disconnect(); 
+0

En mi situación (probando Mongoose dentro de Jest) esta es la única solución que funcionó –

+0

Hago Model.update (..) con Mongoose dentro de un for-loop.¿Es necesario cerrar la conexión después de cada actualización? Mi servidor tiene que manejar muchas actualizaciones y dejó de funcionar después de un tiempo. – Pille

+0

La misma respuesta que abajo – DanFromGermany

1

estoy usando la versión 4.4.2 y ninguna de las otras respuestas trabajó para mí. Pero agregar useMongoClient a las opciones y ponerlo en una variable a la que llamas close parecía funcionar.

var db = mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: true }) 

//do stuff 

db.close() 
Cuestiones relacionadas