Ich gehe ein paar Fehlerszenarien durch und versuche zu verstehen, wie ich mit diesen umgehen soll.
Wenn keine Datenbankverbindung besteht, scheint ein Mongoose Model.find(...)
-Aufruf zu hängen. Unterhalb des Beispielcodes. Ich hätte angenommen, dass der Callback mit einem err
-Objekt aufgerufen wird, aber es ist nicht.
Wie kann ich verhindern, dass der Modellanruf hängen bleibt? Muss ich das readyState
bei jedem Zugriff auf ein Modell manuell überprüfen?
Da Sie bereits einen Fehlerhandler im Verbindungsaufruf verwenden, wäre es sinnvoll, Ihre App zu beenden, wenn die Datenbank nicht verfügbar ist, oder eine Middleware zu aktivieren, die mit einem hübschen 500 Internal Server Error
antwortet.
Mongoose verwendet node-mongodb-native
unter der Haube für Verbindungen zu mongodb, möglicherweise finden Sie dort andere nützliche Verbindungsoptionen. :)
EDIT: Versuchen Sie socketOptions.socketTimeoutMS
einzustellen. Anscheinend gibt es kein festgelegtes Zeitlimit. Siehe Ссылка .
Ich habe keinen Knoten auf meiner Arbeitsmaschine, um die exakte Syntax für Sie auszuprobieren, aber Sie werden wahrscheinlich mongoose.Connection
verwenden müssen, die eine open()
-Methode hat, die Optionen akzeptiert, um zu node-mongodb-native
zu gelangen . Ich glaube nicht, dass mongoose.connect()
diese Optionen akzeptiert, aber ich könnte falsch liegen.
Um dieses Problem zu lösen, müssen Sie 3 Aufgaben ausführen:
Konfigurieren Sie die bufferMaxEntries: 0 im Abschnitt options.db (weitere Einzelheiten finden Sie unter hier ) Bei der Deaktivierung von bufferMaxEntries bewirkt dies, dass mongoose die Pufferbefehle stoppt und erneut versucht, sie zu senden, wenn der Server heruntergefahren ist.
Konfigurieren Sie autoReconnect: false im Abschnitt options.db Deaktivieren Sie autoReconnet in der db-Ebene. (Weitere Informationen finden Sie hier )
Wenn Sie mit dem mongodb-Replicaset arbeiten, müssen Sie bufferCommands in der Schema-Ebene (für jedes von Ihnen erstellte Schema) deaktivieren
var schema = neues Schema ({..}, {bufferCommands: false});