Versuchen Sie nichts Ungewöhnliches mit unbehandelten Ausnahmen zu machen. Lass den Server sterben.
Wenn ein Routen-Handler eine Ausnahme auslöst, fängt Express diese einfach ab und gibt HTTP 500 an den Client zurück. Da Express die Ausnahme abgefangen hat, stürzt Ihr Server nicht ab.
Was normalerweise einen Server zum Absturz bringt, ist, wenn eine Ausnahme innerhalb eines Callbacks ausgelöst wird. zum Beispiel:
app.get('/foo', function(req, res) {
db.query(..., function(err, r) {
throw new Error(); // oops, we'll crash
});
});
Da natürlich der Rückruf außerhalb des Express-Router Call-Stack ausgeführt wird, gibt es keine Möglichkeit, es mit einer bestimmten Anforderung zu verknüpfen. Sie können jedoch gegen eine solche Situation:
app.get('/foo', function(req, res, next) {
db.query(..., function(err, r) {
try {
throw new Error();
} catch(ex) {
next(ex);
}
});
});
Express' next
Funktion nimmt einen Fehler als erstes Argument. Wenn Sie next
mit einem Fehler Argumente nennen, wird es die Verarbeitung Routen stoppen und suchen Sie nach einem error handler oder Rückkehr nur 500.
Natürlich alles in try
/catch
Verpackung ist wahrscheinlich übertrieben; Die meisten Dinge werfen keine Ausnahmen. Sie sollten dies nur tun, wenn Sie wissen etwas werfen könnte. Andernfalls könnten Sie in einen sehr inkonsistenten Zustand geraten, indem Sie Ausnahmen verschlucken.
Es ist wichtig, daran zu denken, dass Ihre Anwendung in einem undefinierten Zustand ist, sobald eine unerwartete Ausnahme ausgelöst wird. Es ist möglich, dass die Problemanforderung nicht ausgeführt wird und Ihre App nie neu gestartet wird. Oder irgendeine andere seltsame Sache könnte passieren. (War es ein Datenbankproblem? Dateisystem? Beschädigter Speicher?)
Diese Arten von Situationen sind unglaublich schwierig zu diagnostizieren, viel weniger zu debuggen. Es ist sicherer und wohl besser, einfach schnell zu versagen, abstürzen zu lassen und den Server schnell neu zu starten. Ja, alle Clients, die zufällig verbunden sind, werden abgeschnitten, aber es ist einfach genug, sie einfach erneut zu versuchen.
Wenn Sie sich Sorgen um die Verfügbarkeit machen, verwenden Sie die cluster module, so dass Sie mehrere (in der Regel Anzahl der CPU-Kerne) Serverprozesse ausführen, und ein Absturz wird nicht die gesamte Website herunterbringen.
Dies ist eine großartige Erklärung. Eine Sache ist mir noch unklar. 'Es ist wichtig, daran zu denken, dass Ihre Anwendung in einem undefinierten Zustand ist, sobald eine unerwartete Ausnahme ausgelöst wird. Es ist möglich, dass die Problemanforderung niemals abgeschlossen wird und Ihre App nie neu gestartet wird ". Das klingt so, als ob ich App nicht anrufen sollte.schließen(); auf Prozess 'exit'. Wahr? – lostintranslation
Der Aufruf von 'app.close()' im 'process'' exit'-Handler ist zwecklos: die [docs say] (http://nodejs.org/api/process.html#process_event_exit) * "Die Hauptereignisschleife wird nicht mehr ausgeführt werden, nachdem der 'exit' Callback beendet ist. '* Mit anderen Worten, das' exit'-Ereignis informiert Sie über den Prozess ** wird ** enden, nachdem Ihre Funktion zurückkehrt. Das Schließen eines Netzwerk-Listeners ist sinnlos, da es kein nächstes Häkchen gibt; Der Code zum Akzeptieren einer eingehenden Verbindung wird niemals ausgeführt werden können. – josh3736
genial, danke! – lostintranslation