Gibt es einen Mungo-Verbindungsfehler-Rückruf?


74

Wie kann ich einen Rückruf für die Fehlerbehandlung festlegen, wenn Mungo keine Verbindung zu meiner Datenbank herstellen kann?

Ich weiß von

connection.on('open', function () { ... });

aber gibt es so etwas

connection.on('error', function (err) { ... });

?


5
Für alle, die über diese Frage stolpern, connection.on('error', function (err) { ... });ist jetzt in 3.X implementiert.
Nepoxx

Antworten:


117

Wenn Sie eine Verbindung herstellen, können Sie den Fehler im Rückruf feststellen:

mongoose.connect('mongodb://localhost/dbname', function(err) {
    if (err) throw err;
});

1
Was ist, wenn mein Server auch bei einem Fehler weiter ausgeführt werden soll? Alles, was ich bisher versucht habe, löst den Fehler aus und beendet dann das Programm.
Winduptoy

2
@evilcelery Alle Abfragen in Mungo werden gepuffert, daher sollten alle ausgeführt werden, sobald Sie erneut eine Verbindung zu db herstellen. Dies ist in Ordnung und sollte keine Ursache für einen unbekannten Status sein.
Pronebird

9
Dies scheint nicht zu funktionieren. Ich kann ihm einen schlechten Uri geben und err gibt immer undefiniert zurück.
Morgan Herlocker

1
Der Fehler stammt aus der Mongoose-Dokumentation für connect () mongoosejs.com/docs/connections.html , in der nicht angegeben ist, dass ein Rückruf möglich ist.
Mikemaccana

2
Dies funktioniert nicht in neueren Mongoose-Versionen (3.X). In der Antwort von Asta finden Sie eine Lösung, die funktioniert.
Nepoxx

41

Es gibt viele Mungo-Rückrufe, die Sie verwenden können.

// CONNECTION EVENTS
// When successfully connected
mongoose.connection.on('connected', function () {  
  console.log('Mongoose default connection open to ' + dbURI);
}); 

// If the connection throws an error
mongoose.connection.on('error',function (err) {  
  console.log('Mongoose default connection error: ' + err);
}); 

// When the connection is disconnected
mongoose.connection.on('disconnected', function () {  
  console.log('Mongoose default connection disconnected'); 
});

// If the Node process ends, close the Mongoose connection 
process.on('SIGINT', function() {  
  mongoose.connection.close(function () { 
    console.log('Mongoose default connection disconnected through app termination'); 
    process.exit(0); 
  }); 
}); 

mehr unter: http://theholmesoffice.com/mongoose-connection-best-practice/


2
Der Rückruf bei Fehler liefert den Fehler nicht mehr. Es ist nur ein boolescher Wert, der wahr sagt.
Amitava Mozumder

21

In diesem Fall funktioniert die Version von Mongoose, die ich ausführe (3.4), wie in der Frage angegeben. Das Folgende kann also einen Fehler zurückgeben.

connection.on('error', function (err) { ... });

1
Auch das funktioniert nicht! Der Wert von err ist einfach 'true'. ohne Beschreibung des tatsächlichen Fehlers.
Amitava Mozumder

@amitavamozumder Überprüfen Sie meine Antwort auf die Verwendung von catch- und try / catch-Methoden zur Behandlung von Fehlern.
Valdeci

5

Wie wir in der Mungo-Dokumentation zur Fehlerbehandlung sehen können , ist das Versprechen die Option, die mit einer Mungo-Verbindung verwendet werden kann , da die connect () -Methode ein Versprechen zurückgibt catch.

Um anfängliche Verbindungsfehler zu behandeln, sollten Sie .catch()oder try/catchmit verwenden async/await.

Auf diese Weise haben wir zwei Möglichkeiten:

Mit der .catch()Methode:

mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true })
.catch(error => console.error(error));

oder mit try / catch:

try {
    await mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
} catch (error) {
    console.error(error);
}

IMHO, ich denke, dass die Verwendung catcheine sauberere Art ist.


Bei einer schlechten Verbindung bekomme ichUnhandledPromiseRejectionWarning: ReferenceError: handleError is not defined
serraosays

@staypuftman the handleError ist eine generische Methode, die es überhaupt nicht gibt. Ich habe meine Frage aktualisiert, um dies klar zu machen.
Valdeci

Verstanden, dummer Fehler an meinem Ende. Es ist nur ein Generikum catch()- danke für die Klarstellung
Serraosays

1
@valdeci danke, dies wurde auch im offiziellen Mungo-Dokument erwähnt. Noch hier suche ich eine Lösung für das gleiche im Stapelüberlauf. Und ich finde das bisher am besten
Joel Joseph

2

Späte Antwort, aber wenn Sie den Server am Laufen halten möchten, können Sie Folgendes verwenden:

mongoose.connect('mongodb://localhost/dbname',function(err) {
    if (err)
        return console.error(err);
});

0
  • Behandeln (fangen) Sie die Verbindungsausnahmen
  • Behandeln Sie andere Verbindungsfehler
  • Zeigen Sie eine Nachricht an, wenn die Verbindung erfolgreich hergestellt wurde
mongoose.connect(
  "mongodb://..."
).catch((e) => {
  console.log("error connecting to mongoose!");
});
mongoose.connection.on("error", (e) => {
  console.log("mongo connect error!");
});
mongoose.connection.on("connected", () => {
  console.log("connected to mongo");
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.