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);
});
Hai 'app.use (app.router)' prima che il gestore degli errori sia impostato su 'app'? – staackuser2
@emostar - no. Tutto il middleware è elencato sopra. – santiagoIT
Va bene, quindi aggiungi 'app.use (app.router)' prima del gestore degli errori;) – staackuser2