2012-02-10 21 views
12

Sto lavorando con un partner su un progetto. Ha scritto molto codice in Node.js + Express, ma abbiamo riscontrato problemi con l'architettura.Come gestire gli errori in Node.js utilizzando Express

Per ovviare a questo, il mio ruolo principale è stato quello di trovare il modo migliore per progettare un'applicazione Node.js + Express. Ho incontrato due scenari, ho a che fare con errori e mi piacerebbe qualche suggerimento.

In primo luogo, come si acquisiscono le eccezioni di primo livello? L'ultima cosa che voglio è che un bug uccida completamente il processo del nodo. Voglio continuare a servire gli utenti di fronte a qualsiasi errore.

In secondo luogo, alcuni errori vengono restituiti tramite richiamate (stiamo usando). Come parte di ogni gestore di percorsi, eseguiamo una visualizzazione (GET), reindirizziamo a un'altra rotta (POST) e vogliamo reindirizzare a una schermata di errore con un messaggio di errore personalizzato. Come posso assicurarmi di catturare questa logica in un posto?

+0

È possibile farlo con domini, si prega di controllare questa risposta: [Gestione degli errori Express o dominio? - risposta] [1] [1]: http://stackoverflow.com/a/27382031/923642 – JakubKnejzlik

risposta

13

In primo luogo, come si acquisiscono le eccezioni di primo livello? L'ultima cosa che voglio è che un bug uccida completamente il processo del nodo. Voglio continuare a servire gli utenti di fronte a qualsiasi errore.

Edit: Penso filosofia del nodo, in generale, è che tutte le eccezioni non gestite fanno dovrebbero uccidere il processo, e che è necessario eseguire il nodo applicazione sotto un qualche tipo di monitor di processo con adeguate strutture di registrazione. Il seguente consiglio riguarda tutti gli altri errori che potresti incontrare nei tuoi gestori di route rapidi ecc.

Express ha un errore generaleHandler, che dovrebbe acquisire tutti gli errori generati e tutto ciò che è passato come parametro a next nelle rotte/nel middleware, e rispondere con 500 Internal Server Error.

In secondo luogo, alcuni errori vengono restituiti tramite callback (stiamo usando caolan/async).Come parte di ogni gestore di percorsi, eseguiamo una visualizzazione (GET), reindirizziamo a un'altra rotta (POST) e vogliamo reindirizzare a una schermata di errore con un messaggio di errore personalizzato. Come posso assicurarmi di catturare questa logica in un unico posto?

Si potrebbe creare un costume handleError, che si chiama in ogni richiamata in questo modo:

async.series(..., function(err, results) { 
    if(err) 
    return handleError(req, res, err); 
    // ... 
}); 

Oppure si può semplicemente passare gli errori avanti con next(err) e implementare il gestore degli errori personalizzato, come descritto qui: http://expressjs.com/guide/error-handling.html

+2

The Express errorHandler NON rilevare gli errori che si verificano al di fuori del percorso gestori/middleware. Quindi, se si verifica un errore al di fuori dei tuoi 'app.use()' o 'app.get | post | put | delete()', non puoi fare affidamento su expressHandler per catturarlo. – timkg

4

eccezioni livello superiore:

È possibile utilizzare la uncaughtException event from process, ma non è generalmente raccomandato.

Spesso le applicazioni entrano in uno stato corrotto (ad esempio, si dispone di uno stato che tipicamente viene impostato, ma l'eccezione ha causato che non si verifichi) quando viene generata un'eccezione. Quindi, causerà sempre più errori da lì in poi.

Un approccio consigliato è quello di utilizzare qualcosa come forever per riavviare automaticamente l'app nel caso in cui si blocchi. In questo modo avrai l'applicazione in uno stato normale anche dopo un incidente.

movimentazione in espresso Errore:

È possibile creare una nuova istanza errore e passarlo al prossimo richiamata nella catena.

Es.

express.get('/some/url', function(req, res, next) { 
    //something here 
    if(error) { 
     next(new Error('blah blah')); 
    } 
}); 

Per gestire l'errore da qui in poi, è possibile impostare un gestore errori. Vedi express docs on error handling

3

Checkout l'eccellente modulo di registro di gestione Winston: https://github.com/flatiron/winston

permette di configurare gestione delle eccezioni in un modo che non solo lo registrerà, ma consentirà al processo di continuare. E poiché questi sarebbero ovviamente problemi seri, puoi anche configurare Winston per inviare e-mail su specifici tipi di eventi (come le eccezioni).

Problemi correlati