Skip to content

错误处理

错误处理是指 Express 如何捕获和处理同步和异步发生的错误。 Express 附带默认错误处理程序,因此您无需编写自己的错误处理程序即可开始使用

捕获错误

对于路由处理程序和中间件调用的异步函数返回的错误,您必须将它们传递给函数 next(),Express 将在其中捕获并处理它们。例如:

js
app.get('/', function (req, res, next) {
  fs.readFile('/file-does-not-exist', function (err, data) {
    if (err) {
      next(err) // 将错误传递给 Express
    } else {
      res.send(data)
    }
  })
})

默认错误处理程序

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

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

当写入错误时,以下信息将添加到响应中:

  • 设置 res.statusCodeerr.status(或 err.statusCode )。如果此值超出 4xx 或 5xx 范围,则将设置为 500
  • res.statusMessage 根据状态码进行设置
  • 在生产环境中,正文将是状态代码消息的 HTML,否则将是 err.stack
  • 对象中指定的任何标题 err.headers
js
function errorHandler (err, req, res, next) {
  if (res.headersSent) {
    return next(err)
  }
  res.status(500)
  res.render('error', { error: err })
}

请注意,如果您 next() 在代码中多次调用错误,即使已设置自定义错误处理中间件,也会触发默认错误处理程序。

编写错误处理程序

错误处理中间件函数的定义方式与其他中间件函数相同,只是错误处理函数有四个参数而不是三个: (err, req, res, next)。例如:

js
app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

要最后定义错误处理中间件,在其他 app.use() 和路由调用之后;例如:

js
var bodyParser = require('body-parser')
var methodOverride = require('method-override')

app.use(bodyParser.urlencoded({
  extended: true
}))
app.use(bodyParser.json())
app.use(methodOverride())
app.use(function (err, req, res, next) {
  // logic
})

next(err) 将跳过链中所有剩余的处理程序,除了那些设置为处理错误的处理程序

Released under the MIT License.