Express 申请中未处理的拒绝

2024-05-01

我的 Express 应用程序中运行着许多基于 ES6 Promise 的代码。如果有一个错误从未被捕获,我将使用以下代码来处理它:

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.

我将如何在一个页面上呈现 500 个页面unhandledRejection?


将 unhandledRejection 放入中间件中......通常会导致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 文档 http://expressjs.com/guide/error-handling.html:

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

如果将错误传递给 next() 并且不在错误处理程序中处理它,它将由内置错误处理程序处理 - 错误将通过堆栈跟踪写入客户端。堆栈跟踪不包含在生产环境中。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Express 申请中未处理的拒绝 的相关文章

随机推荐