错误处理
错误处理是指 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_ENV
为 production
,以在生产模式下运行应用程序。
当写入错误时,以下信息将添加到响应中:
- 设置
res.statusCode
为err.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)
将跳过链中所有剩余的处理程序,除了那些设置为处理错误的处理程序