Несколько советов:
1) Ваш код не работал потому что ваше промежуточное программное обеспечение обработчика ошибок было запущено до того, как ваш маршрут был достигнут, поэтому обработчик ошибок никогда не имел возможности передать эту ошибку. Этот стиль известен как продолжение прохождения. Поместите обработчик ошибок в стек промежуточного программного обеспечения.
2) Вы должны закрыть сервер, если у вас есть необработанная ошибка. Лучший способ сделать это, чтобы позвонить server.close()
, где сервер является результатом делать var server = http.createServer(app);
Что значит, вы должны сделать что-то вроде этого:
var server = http.createServer(app);
app.use(function(err, req, res, next) {
console.log("error!!!");
res.send("error!!!");
server.close();
});
Вы должны, вероятно, также тайм-аут в server.close(), в случае, если он не может выполнить (ваше приложение находится в неопределенном состоянии, в конце концов):
var server = http.createServer(app);
app.use(function(err, req, res, next) {
console.log("error!!!");
res.send("error!!!");
server.close();
setTimeout(function() {
process.exit(1);
}, 3*1000);
});
Я сделал библиотеку, которая делает все это для вас, и позволяет определять собственные ответы, в том числе специализированной представления ошибок, статические файлы для обслуживания и т. д. ...:
https://github.com/ericelliott/express-error-handler
Для людей из будущего app.router устарел для процесса миграции 3.x => 4.x; см. https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x. –