Cierra correctamente la conexión de la mangosta una vez que hayas terminado


145

Estoy usando mangosta en un script que no está destinado a ejecutarse continuamente, y me enfrento a lo que parece ser un problema muy simple, pero no puedo encontrar una respuesta; simplemente, 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 + co Program.exit ().

El código se ve 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);

Intenté agregar llamadas a mongoose.disconnect () pero no al resultado. Aparte de eso, todo funciona bien (encontrar, guardar, ...).

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

Gracias

EDITAR: aceptó la respuesta a continuación, ya que es técnicamente correcta, pero si alguien alguna vez vuelve a encontrar este problema, parece que la 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, no lo hace una vez que las consultas terminan de ejecutarse; simplemente descarta su llamada sin lanzar ninguna excepción ni nada por el estilo, y nunca cierra la conexión.

Así que ahí lo tiene: asegúrese de que cada consulta se haya procesado antes de llamar a desconectar () si desea que realmente funcione.


1
¿Hay alguna manera de hacer esto simplemente importando un modelo? ninguna de las respuestas a continuación funciona: \
Anthony

Respuestas:


201

Puedes cerrar la conexión con

mongoose.connection.close()

25
De hecho, esto cierra la conexión. Sin embargo, esta llamada estaba borrando el contenido de mi base de datos. Cuando cambié a mongoose.disconnect () todo funcionó correctamente y mis pruebas de mocha comenzaron a funcionar correctamente nuevamente
Brian Noah

1
Esto funcionó para mí. Solo necesitaba asegurarme de colocar esto en la devolución de llamada correcta o de lo contrario probablemente cerraría la conexión antes de poder guardar 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

66
Como puede ver, estas respuestas son viejas. Si está utilizando Mongoose 5.0.4 , el Connection.close()método solo se exporta, solo está disponible, así que úselo .
Константин Ван

74

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


Esto también se prefiere al derribar un entorno de prueba.
Matt Lo

1
mongoose.disconnect () es mejor para usar y un enfoque lógico.
Abdul Alim Shakir

17

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

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

// Do some stuff

db.disconnect();

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

Hago Model.update (..) con Mongoose dentro de un ciclo for. ¿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

Misma respuesta que a continuación
Daniel W.

3

Estoy usando la versión 4.4.2 y ninguna de las otras respuestas funcionó para mí. Pero agregar useMongoClienta las opciones y ponerlo en una variable a la que llame closeparece funcionar.

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

//do stuff

db.close()

1

Recibirá un error si intenta cerrar / desconectarse fuera del método. La mejor solución es cerrar la conexión en ambas devoluciones de llamada en el método. El código ficticio está aquí.

const newTodo = new Todo({text:'cook dinner'});

newTodo.save().then((docs) => {
  console.log('todo saved',docs);
  mongoose.connection.close();
},(e) => {
  console.log('unable to save');
});

1

Tal como dijo Jake Wilson: puede configurar la conexión a una variable y luego desconectarla cuando haya terminado:

let db;
mongoose.connect('mongodb://localhost:27017/somedb').then((dbConnection)=>{
    db = dbConnection;
    afterwards();
});


function afterwards(){

    //do stuff

    db.disconnect();
}

o si está dentro de la función Async:

(async ()=>{
    const db = await mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: 
                  true })

    //do stuff

    db.disconnect()
})

de lo contrario, cuando lo estaba revisando en mi entorno, tenía un error.


0

Probablemente tengas esto:

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

// Do some stuff

db.disconnect();

pero también puedes tener algo como esto:

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

const model = mongoose.model('Model', ModelSchema);

model.find().then(doc => {
  console.log(doc);
}

no puede llamar db.disconnect()pero puede cerrar la conexión después de usarla.

model.find().then(doc => {
  console.log(doc);
}).then(() => {
  mongoose.connection.close();
});
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.