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


145

J'utilise mangouste dans un script qui n'est pas destiné à fonctionner en continu, et je suis confronté à ce qui semble être un problème très simple mais je ne trouve pas de réponse; simplement une fois que je fais un appel à n'importe quelle fonction mangouste 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 aucun résultat. A part ça, tout fonctionne bien (recherche, sauvegarde, ...).

C'est exactement le même problème que cette personne, malheureusement, il 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 à nouveau ce problème, il semble que mangouste et / ou le pilote mongodb ne ferme pas réellement la connexion lorsque vous lui demandez si des requêtes sont toujours en cours d'exécution.

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

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


1
Existe-t-il un moyen de le faire simplement à partir de l'importation d'un modèle? aucune des réponses ci-dessous ne fonctionne: \
Anthony

Réponses:


201

Vous pouvez fermer la connexion avec

mongoose.connection.close()

25
Cela ferme en fait la connexion. Cependant, cet appel effaçait le contenu de ma base de données. Quand je suis passé à mongoose.disconnect (), tout fonctionnait correctement et mes tests de moka ont recommencé à fonctionner correctement
Brian Noah

1
Cela a fonctionné pour moi. J'avais juste besoin de m'assurer que j'avais placé cela dans le bon rappel, sinon il fermait probablement la connexion avant que l'enregistrement dans la base de données ait une chance de se terminer. Pour être honnête, j'utilise toujours un script simple qui se connecte simplement à la base de données locale et enregistre un exemple d'objet utilisateur simple. Dans le rappel de user.save (), j'appelle mongoose.connection.close ().
FateNuller

6
Comme vous pouvez le voir, ces réponses sont anciennes. Si vous utilisez Mongoose 5.0.4 , la Connection.close()méthode est uniquement exportée, uniquement disponible, alors utilisez-la.
Константин Ван

74

L'autre réponse n'a pas fonctionné pour moi. J'ai dû utiliser mongoose.disconnect();comme indiqué dans cette réponse .


Ceci est également préférable lors de la destruction d'un environnement de test.
Matt Lo du

1
mongoose.disconnect () est préférable à utiliser et une approche logique.
Abdul Alim Shakir

17

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

Dans ma situation (tester Mongoose à l'intérieur de Jest), c'est la seule solution qui a fonctionné
Code Whisperer

Je fais Model.update (..) avec Mongoose dans une boucle for. Est-il nécessaire de fermer la connexion après chaque mise à jour? Mon serveur doit gérer de nombreuses mises à jour et a cessé de fonctionner après un certain temps.
Pille

Même réponse que ci
Daniel W.

3

J'utilise la version 4.4.2 et aucune des autres réponses n'a fonctionné pour moi. Mais ajouter useMongoClientdes options et les mettre dans une variable que vous appelez closesemblait fonctionner.

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

//do stuff

db.close()

1

Vous obtiendrez une erreur si vous essayez de fermer / déconnecter en dehors de la méthode. La meilleure solution consiste à fermer la connexion dans les deux rappels de la méthode. Le code factice est ici.

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

Tout comme Jake Wilson l'a dit: vous pouvez définir la connexion sur 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 dans la fonction Async:

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

    //do stuff

    db.disconnect()
})

sinon, lorsque je le vérifiais dans mon environnement, il y avait une erreur.


0

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();
});
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.