Express 3 error middleware não sendo chamado
Eu estou tentando configurar o tratamento de erros para o meu aplicativo expresso e executando o seguinte problema.
Eu defini um middleware de erro e o adiciono como o último middleware:
// error handler
app.use(function(err, req, res, next) {
console.log('JUST TESTING. ERROR HANLDER HAS BEEN CALLED...');
next(err);
});
Agora eu esperaria que esse middleware fosse chamado sempre que ocorresse um erro:
app.get('/datenschutz', function(req, res, next){
return next(new Error('Just testing')); // handle everything here
});
No entanto, meu middleware nunca é chamado! O navegador não exibe o rastreamento de pilha no entanto. Isto parece que há outro middleware que está pegando esse erro e o processa antes que eu possa fazer algo sobre isso.
O problema é que não tenho idéia de onde esse middleware poderia ser definido, pois tenho uma configuração muito simples:
// setup ssl for local testing
var
app = express();
app.
use(express.static(__dirname + '/public')).
use(express.bodyParser()).
use(express.cookieParser());
Por que meu erro ao lidar com o middleware não é chamado? Onde está ocorrendo esse tratamento de erro 'padrão'?
Obrigado!
* EDIT * Eu vejo que o middleware está de fato funcionando. No entanto, este é o caso se eu chamá-lo de outra função de middleware. No entanto, ele não está sendo chamado se o erro ocorrer dentro de uma função definida como uma rota expressa (GET, POST, etc.). Isto é muito estranho. Se eu adicionar meu middleware de erro aos retornos de chamada de rota, ele funcionará:
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 - ENCONTRADA ACEITÁVEL ENCONTRADA ** Estou surpreso que tenha que ser feito dessa maneira. Como eu tinha lido muitas entradas / perguntas sobre o tratamento de erros em expresso e nunca encontrei essa possibilidade mencionada. No entanto, parece que, se ocorrer um erro dentro de um roteador de retorno de chamada regular, os manipuladores de middleware não o receberão. Você precisará definir um manipulador de erro no nível da rota.
app.all('*', function(err,req,res,next) {
console.log('This is a global error handler at route level....');
return next(err);
});