Non cercare di fare niente di speciale con le eccezioni non gestite. Lascia morire il server.
In genere, se un gestore di route genera un'eccezione, Express lo cattura e restituisce un HTTP 500 al client. Poiché Express ha riscontrato un'eccezione, il tuo server non si arresterà in modo anomalo.
Quello che di solito accade che fa cadere un server è quando un'eccezione viene lanciata all'interno di un callback; per esempio:
app.get('/foo', function(req, res) {
db.query(..., function(err, r) {
throw new Error(); // oops, we'll crash
});
});
Perché il callback esegue naturalmente al di fuori dello stack di chiamate router Express, non c'è modo per associarlo con una richiesta specifica. Tuttavia, è possibile evitare una situazione del genere:
app.get('/foo', function(req, res, next) {
db.query(..., function(err, r) {
try {
throw new Error();
} catch(ex) {
next(ex);
}
});
});
Funzione Express next
prende un errore come primo argomento. Se si chiama next
con un argomento di errore, si fermerà l'elaborazione di percorsi e cercare un error handler, o semplicemente restituire un 500.
Naturalmente, avvolgendo tutto in try
/catch
è probabilmente eccessivo; la maggior parte delle cose in realtà non genera eccezioni. Lo si dovrebbe fare solo se si conosce qualcosa. Altrimenti, si potrebbe finire in uno stato incoerente molto difficile da debug ingerendo le eccezioni.
È importante ricordare che una volta generata un'eccezione imprevista, l'applicazione si trova in uno stato indefinito. È possibile che la richiesta del problema non venga mai completata e l'app non si riavvierà mai. O potrebbe accadere qualsiasi numero di altre strane cose. (Era un problema di database? Filesystem? Memoria corrotta?)
Questi tipi di situazioni sono incredibilmente difficili da diagnosticare e molto meno debug. È più sicuro e probabilmente meglio fallire rapidamente, crash e riavviare rapidamente il server. Sì, tutti i client che si connettono verrebbero tagliati, ma è abbastanza facile per loro semplicemente riprovare.
Se si è preoccupati della disponibilità, utilizzare cluster module in modo che siano in esecuzione diversi processi del server (in genere numero di core CPU) e un arresto anomalo non comporterà l'arresto dell'intero sito.
Questa è una grande spiegazione. Una cosa non mi è ancora chiara. "È importante ricordare che una volta generata un'eccezione imprevista, la tua applicazione si trova in uno stato indefinito. È possibile che la richiesta del problema non venga mai completata e la tua app non si riavvierà mai più ". Questo suona come se non dovessi chiamare app.vicino(); in corso "uscita". Vero? – lostintranslation
Chiamare 'app.close()' nel 'process'' exit' handler è inutile: il [docs say] (http://nodejs.org/api/process.html#process_event_exit) * "Il ciclo dell'evento principale sarà non viene più eseguito dopo la richiamata di "uscita". * In altre parole, l'evento "exit" ti dice che il processo ** finirà dopo il ritorno della tua funzione. La chiusura di un listener di rete è inutile poiché non esiste un tick successivo; il codice per accettare una connessione in ingresso non avrà mai l'opportunità di essere eseguito. – josh3736
fantastico, grazie! – lostintranslation