Schließen Sie die Verbindung des Mungos ordnungsgemäß, sobald Sie fertig sind

145

Ich verwende Mungo in einem Skript, das nicht kontinuierlich ausgeführt werden soll, und stehe vor einem scheinbar sehr einfachen Problem, kann jedoch keine Antwort finden. Einfach ausgedrückt, sobald ich eine Mungofunktion aufrufe, die Anforderungen an mongodb sendet, stoppt meine nodejs-Instanz nie und ich muss sie manuell beenden, z. B. mit Strg + c oder Program.exit ().

Der Code sieht ungefähr so ​​aus:

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

Ich habe versucht, Aufrufe zu mongoose.disconnect () hinzuzufügen, aber kein Ergebnis. Abgesehen davon funktioniert alles gut (finden, speichern, ...).

Dies ist genau das gleiche Problem wie bei dieser Person. Leider hat sie keine Antwort erhalten: https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

Vielen Dank

BEARBEITEN: Akzeptierte die unten stehende Antwort, da sie technisch korrekt ist. Wenn jedoch jemand dieses Problem erneut auftritt, scheint es, dass Mungo und / oder der Mongodb-Treiber die Verbindung nicht tatsächlich schließen, wenn Sie danach fragen, ob noch Abfragen ausgeführt werden.

Es erinnert sich überhaupt nicht an den Verbindungsabbruch, es tut es nicht, sobald die Abfragen beendet sind. Es verwirft einfach Ihren Anruf ohne Ausnahme oder ähnliches und schließt die Verbindung nie wirklich.

Da haben Sie es also: Stellen Sie sicher, dass jede Abfrage verarbeitet wurde, bevor Sie separect () aufrufen, wenn Sie möchten, dass sie tatsächlich funktioniert.

Lepidosteus
quelle
1
Gibt es eine Möglichkeit, dies nur durch den Import eines Modells zu tun? Keine der folgenden Antworten funktioniert: \
Anthony

Antworten:

201

Sie können die Verbindung mit schließen

mongoose.connection.close()
Kenan
quelle
25
Dies schließt tatsächlich die Verbindung. Dieser Aufruf löschte jedoch den Inhalt in meiner Datenbank. Als ich zu mongoose.disconnect () wechselte, funktionierte alles richtig und meine Mokka-Tests begannen wieder richtig zu funktionieren
Brian Noah
1
Das hat bei mir funktioniert. Ich musste nur sicherstellen, dass ich dies in den richtigen Rückruf eingefügt habe, sonst wurde wahrscheinlich die Verbindung geschlossen, bevor das Speichern in der Datenbank beendet werden konnte. Um fair zu sein, verwende ich immer noch ein einfaches Skript, das nur eine Verbindung zur lokalen Datenbank herstellt und ein einfaches Beispielbenutzerobjekt speichert. Im Rückruf zu user.save () rufe ich mongoose.connection.close () auf.
FateNuller
6
Wie Sie sehen können, sind diese Antworten alt. Wenn Sie Mongoose 5.0.4 verwenden , wird die Connection.close()Methode nur exportiert und ist nur verfügbar. Verwenden Sie sie daher.
9онстант .н Ван
74

Die andere Antwort hat bei mir nicht funktioniert. Ich musste mongoose.disconnect();wie in dieser Antwort angegeben verwenden .

msrxthr
quelle
Dies wird auch bevorzugt, wenn eine Testumgebung abgerissen wird.
Matt Lo
1
mongoose.disconnect () ist besser zu verwenden und ein logischer Ansatz.
Abdul Alim Shakir
16

Sie können die Verbindung zu einer Variablen festlegen und diese dann trennen, wenn Sie fertig sind:

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

// Do some stuff

db.disconnect();
Jake Wilson
quelle
In meiner Situation (Mungo in Jest testen) ist dies die einzige Lösung, die funktioniert hat
Code Whisperer
Ich mache Model.update (..) mit Mongoose innerhalb einer for-Schleife. Muss die Verbindung nach jedem Update geschlossen werden? Mein Server muss viele Updates verarbeiten und funktioniert nach einer Weile nicht mehr.
Pille
Gleiche Antwort wie unten
Daniel W.
3

Ich verwende Version 4.4.2 und keine der anderen Antworten hat für mich funktioniert. Aber das Hinzufügen useMongoClientzu den Optionen und das Einfügen in eine Variable, die Sie aufrufen, closeschien zu funktionieren.

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

//do stuff

db.close()
Tumelo
quelle
1

Sie erhalten eine Fehlermeldung, wenn Sie versuchen, außerhalb der Methode zu schließen / zu trennen. Die beste Lösung besteht darin, die Verbindung in beiden Rückrufen in der Methode zu schließen. Der Dummy-Code ist hier.

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');
});
Ramanand Prajapati
quelle
1

Genau wie Jake Wilson sagte: Sie können die Verbindung zu einer Variablen einstellen und sie dann trennen, wenn Sie fertig sind:

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


function afterwards(){

    //do stuff

    db.disconnect();
}

oder wenn innerhalb der Async-Funktion:

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

    //do stuff

    db.disconnect()
})

Andernfalls ist beim Überprüfen in meiner Umgebung ein Fehler aufgetreten.

adir abargil
quelle
0

Wahrscheinlich haben Sie Folgendes:

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

// Do some stuff

db.disconnect();

Sie können aber auch so etwas haben:

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

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

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

Sie können nicht anrufen, db.disconnect()aber Sie können die Verbindung schließen, nachdem Sie sie verwendet haben.

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