179 votes

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

J'utilise mongoose dans un script qui n'est pas censé fonctionner en continu, et je suis confronté à ce qui semble être un problème très simple, mais je n'arrive pas à trouver de réponse ; tout simplement, une fois que j'ai fait un appel à une fonction mongoose qui envoie des requêtes à mongodb, mon instance nodejs ne s'arrête jamais et je dois la tuer manuellement avec, disons, 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 sans résultat. En dehors de cela, tout fonctionne bien (recherche, sauvegarde, ...).

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

Gracias

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

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 lever d'exception ou quoi que ce soit de ce genre, et ne ferme jamais réellement la connexion.

Voilà : assurez-vous que toutes les requêtes ont été traitées avant d'appeler disconnect() si vous voulez que cela fonctionne réellement.

249voto

Kenan Points 942

Vous pouvez fermer la connexion avec

mongoose.connection.close()

102voto

user14269686 Points 767

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

19voto

Jakobud Points 14581

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

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

// Do some stuff

db.disconnect();

6voto

Comme l'a dit Jake Wilson : Vous pouvez définir la connexion à une variable puis la déconnecter lorsque vous avez terminé :

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

function afterwards(){

    //do stuff

    db.disconnect();
}

ou si elle se trouve dans une fonction asynchrone :

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

    //do stuff

    db.disconnect()
})

Sinon, lorsque je l'ai vérifié dans mon environnement, une erreur s'est produite.

3voto

tumelo Points 88

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

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

//do stuff

db.close()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X