默认错误处理程序

中英双语

Express 带有一个内置的错误处理程序,可以处理应用程序中可能遇到的任何错误。这个默认的错误处理中间件函数被添加到中间件函数栈的末尾。

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

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

写入错误时,会在响应中添加以下信息:

  • res.statusCodeerr.status(或 err.statusCode)设置。如果此值超出 4xx 或 5xx 范围,则将设置为 500。
  • res.statusMessage 根据状态码设置。
  • 在生产环境中,body 为状态码消息的 HTML,否则为 err.stack
  • err.headers 对象中指定的任何标头。

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

因此,当您添加自定义错误处理程序时,您必须委托默认的 Express 错误处理程序,此时标头已发送到客户端:

function errorHandler (err, req, res, next) {
  if (res.headersSent) {
    return next(err)
  }
  res.status(500)
  res.render('error', { error: err })
}

请注意,如果您多次调用 next() 并在代码中出现错误,则可能会触发默认错误处理程序,即使自定义错误处理中间件已到位。