Express应用程序中未处理的拒绝 [英] Unhandled rejections in Express applications

查看:12
本文介绍了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');
});

来自ExpressJS Documentation

Express附带了一个内置的错误处理程序,它可以处理应用程序中可能遇到的任何错误。此默认错误处理中间件添加到中间件堆栈的末尾。

如果您将错误传递给Next(),但没有在错误处理程序中处理它,则它将由内置的错误处理程序处理-错误将与堆栈跟踪一起写入客户端。生产环境中不包括堆栈跟踪。

将环境变量NODE_ENV设置为"Products",以在生产模式下运行应用程序。

如果您在开始编写响应后调用Next()时出现错误,例如,如果您在将响应流式传输到客户端时遇到错误,Express的默认错误处理程序将关闭连接并使请求被视为失败。

因此,当您添加自定义错误处理程序时,当标头已发送到客户端时,您将希望委托给Express中的默认错误处理机制。

这篇关于Express应用程序中未处理的拒绝的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆