web-dev-qa-db-fra.com

Fermez correctement la connexion de mangouste une fois que vous avez terminé

J'utilise la mangouste dans un script qui n'est pas conçu pour fonctionner en continu, et je fais face à ce qui semble être un problème très simple, mais je ne trouve pas de réponse; En d'autres termes, une fois que j'appelle n'importe quelle fonction mangouste qui envoie des demandes à mongodb, mon instance de nodejs ne s'arrête jamais et je dois la tuer manuellement avec, par exemple, Ctrl + c ou Program.exit ().

Le code ressemble à peu près à ceci:

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

J'ai essayé d'ajouter des appels à mongoose.disconnect () mais aucun résultat. En dehors de cela, tout fonctionne bien (recherche, sauvegarde, ...).

C'est exactement le même problème que cette personne, malheureusement, elle n'a reçu aucune réponse: https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

Merci

EDIT: a accepté la réponse ci-dessous car elle est techniquement correcte, mais si quelqu'un rencontre ce problème à nouveau, il semble que Mongoose et/ou le pilote mongodb ne ferme pas réellement la connexion lorsque vous lui demandez s'il y a encore des requêtes en cours d'exécution.

Il ne se souvient même pas de l'appel de déconnexion, il ne le fait pas une fois que les requêtes sont terminées; il rejette simplement votre appel sans exception ou quoi que ce soit du genre, et ne ferme jamais la connexion.

Donc, voilà: assurez-vous que chaque requête a été traitée avant d'appeler disconnect () si vous voulez que cela fonctionne réellement.

106
Lepidosteus

Vous pouvez fermer la connexion avec

mongoose.connection.close()
156
Kenan

L'autre réponse n'a pas fonctionné pour moi. Je devais utiliser mongoose.disconnect(); comme indiqué dans cette réponse

56
msrxthr

Vous pouvez définir la connexion sur une variable, puis la déconnecter lorsque vous avez terminé:

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

// Do some stuff

db.disconnect();
11
Jake Wilson

J'utilise la version 4.4.2 et aucune des autres réponses n'a fonctionné pour moi. Mais ajouter useMongoClient aux options et le placer dans une variable que vous appelez close on semblait fonctionner. 

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

//do stuff

db.close()
3
tumelo

Vous avez probablement ceci:

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

// Do some stuff

db.disconnect();

mais vous pouvez aussi avoir quelque chose comme ça:

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

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

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

vous ne pouvez pas appeler db.disconnect() mais vous pouvez fermer la connexion après l'avoir utilisée.

model.find().then(doc => {
  console.log(doc);
}).then(() => {
  mongoose.connection.close();
});
0
Carlos Abraham

vous obtiendrez une erreur si vous essayez de fermer/déconnecter en dehors de la méthode then. La meilleure solution est de fermer la connexion dans les deux callbacks avec méthode, puis le code factice est ici.

var newTodo=new Todo({text:'cook dinner'});
newTodo.save().then((docs)=>{
  console.log('todo saved',docs);
 mongoose.connection.close();//mongoose.disconnect(); also work and prefered
},(e)=>{
  console.log('unable to save');

});
  

0
Ramanand Prajapati