2012-11-02 11 views
19

Sto tentando di impostare la gestione degli errori per la mia app Express e il problema seguente.Il middleware degli errori Express 3 non viene chiamato

ho definito un middleware di errore e aggiungerlo come l'ultimo middleware:

// error handler 
app.use(function(err, req, res, next) { 

    console.log('JUST TESTING. ERROR HANLDER HAS BEEN CALLED...'); 
    next(err); 
}); 

Ora ci si aspetterebbe questo middleware di essere chiamato ogni volta che si verifica un errore:

app.get('/datenschutz', function(req, res, next){ 
     return next(new Error('Just testing')); // handle everything here 
    }); 

Tuttavia il mio middleware non è mai chiamato! Il browser mostra tuttavia la traccia dello stack. Sembra che ci sia un altro middleware che sta rilevando questo errore e lo sta elaborando prima che io possa fare qualcosa al riguardo.

Il problema è che non ho idea di dove potrebbe essere definita tale middleware, come ho una molto semplice impostazione:

// setup ssl for local testing 
var 
    app = express(); 

app. 
    use(express.static(__dirname + '/public')). 
    use(express.bodyParser()). 
    use(express.cookieParser()); 

Perché sta gestendo il mio errore middleware non essere chiamato? Dove si sta verificando questo errore "predefinito"?

Grazie!

* EDIT * Vedo che il middleware funziona davvero. Tuttavia questo è il caso se lo chiamo da un'altra funzione middleware. Tuttavia non viene invocato se l'errore si verifica all'interno di una funzione definita come percorso espresso (GET, POST, ecc.). Questo è molto strano Se aggiungo il mio middleware di errore per i callback percorso funziona allora:

app.get('/testError', function(req, res, next){ 
     return next(new Error('Just testing')); // handle everything here 
    }, function(err,req,res,next) { 
     console.log('This error handler is called!!'); 
     return next(); 
    }); 

* EDIT 2 - TROVATO SOLUZIONE ACCETTABILE ** Sono sorpreso che deve essere fatto in questo modo. Come ho letto molte voci/domande sulla gestione degli errori in espresso e mai trovato questa possibilità menzionata. Tuttavia, sembra che se un errore si verifica all'interno di una route callback i normali middleware handler di errore non lo raccolgono. Sarà necessario definire un gestore errori a livello di percorso.

app.all('*', function(err,req,res,next) { 
     console.log('This is a global error handler at route level....'); 
     return next(err); 
    }); 
+3

Hai 'app.use (app.router)' prima che il gestore degli errori sia impostato su 'app'? – staackuser2

+0

@emostar - no. Tutto il middleware è elencato sopra. – santiagoIT

+9

Va bene, quindi aggiungi 'app.use (app.router)' prima del gestore degli errori;) – staackuser2

risposta

1

EDIT 2 (sabtioagoIT) funziona. Ma proprio per coloro che lo mancavano, la soluzione di emostar funziona anche. Ho capito di spostare la chiamata di 'uso' alla gestione degli errori fino alla fine, ma sembra esserci un'opzione più semplice come suggerisce emoster, usa app.router (prima dell'errore che gestisce la chiamata 'use').

3

Ho avuto questo problema, ma non sono riuscito a capire perché non funzionava anche se ho impostato il mio gestore degli errori dopo il app.user(app.router). A quanto pare, avevo già un gestore degli errori di cui non ero a conoscenza.

In particolare, se si utilizza la CLI esplicita per generare un app come ho fatto io, si aggiungerà automaticamente in questo:

if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

Purtroppo per me, ho aggiunto un po 'più middleware per la mia app, che di conseguenza oscurò questa affermazione e quindi evitò che il mio gestore di errori personalizzato venisse chiamato.

Rimuovere semplicemente quello e quindi dovrebbe funzionare correttamente.

In una nota a margine, devo menzionare che la soluzione originale funzionava ancora, anche con lo app.use(express.errorHandler()).

app.all('*', function(err,req,res,next) { 
    console.log('This is a global error handler at route level....'); 
    return next(err); 
}); 
1

Risposta aggiornata per utenti Express 4 from the Express 4 docs. Guarda l'esempio dai documenti di seguito. Si noti che app.router è deprecato e non più utilizzato. Ho anche aggiunto un percorso fittizio per rendere l'ordinamento chiaro:

"si definisce di gestione degli errori middleware scorso, dopo che altre app.use() e percorsi chiama, ad esempio:

var bodyParser = require('body-parser'); 

app.use(bodyParser()); 
app.get('/', function(req, res) { 
    res.send('hello world'); 
}) 
app.use(function(err, req, res, next) { 
    // logic 
}); 

"

Problemi correlati