Express应用程序中未处理的拒绝 [英] Unhandled rejections in Express applications
本文介绍了Express应用程序中未处理的拒绝的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有很多基于ES6 Promise的代码在我的Express应用程序中运行。如果有一个从未被捕获的错误,我将使用以下代码来处理它:
process.on('unhandledRejection', function(reason, p) {
console.log("Unhandled Rejection:", reason.stack);
process.exit(1);
});
对于调试目的,这可以很好地工作。
然而,在生产中,我想要触发500错误处理程序,以向用户显示标准的"有些出错"页面。我有此捕获所有错误处理程序,该处理程序当前可用于其他异常:app.use(function(error, req, res, next) {
res.status(500);
res.render('500');
});
将unhandledRejection放入中间件不起作用,因为它是异步的,通常会导致Error: Can't render headers after they are sent to the client.
如何在unhandledRejection
上呈现500页?
推荐答案
将未处理的拒绝放入中间件中...通常会导致
Error: Can't render headers after they are sent to the client.
稍微更改错误处理程序:
// production error handler
const HTTP_SERVER_ERROR = 500;
app.use(function(err, req, res, next) {
if (res.headersSent) {
return next(err);
}
return res.status(err.status || HTTP_SERVER_ERROR).render('500');
});
Express附带了一个内置的错误处理程序,它可以处理应用程序中可能遇到的任何错误。此默认错误处理中间件添加到中间件堆栈的末尾。
如果您将错误传递给Next(),但没有在错误处理程序中处理它,则它将由内置的错误处理程序处理-错误将与堆栈跟踪一起写入客户端。生产环境中不包括堆栈跟踪。将环境变量NODE_ENV设置为"Products",以在生产模式下运行应用程序。
如果您在开始编写响应后调用Next()时出现错误,例如,如果您在将响应流式传输到客户端时遇到错误,Express的默认错误处理程序将关闭连接并使请求被视为失败。
因此,当您添加自定义错误处理程序时,当标头已发送到客户端时,您将希望委托给Express中的默认错误处理机制。
这篇关于Express应用程序中未处理的拒绝的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文