Express中,错误处理通过特殊的中间件来完成。如前所述,一般中间件的参数为3个:req
,res
, next
。如果你use
一个4个参数的中间件,它将被Express视为错误处理中间件。下面便是一个错误处理中间件,当出于开发环境时使用:
// file: app.js
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500); // 状态码默认为500(服务器内部错误)
res.render('error', {
message: err.message,
error: err // 生产环境中应设为 `error: {}`,禁止输出错误
});
});
}
提示
这里的res.render
将第二个参数指定的数据传递给第一个参数指定的模板error.hbs
,得到HTML并返回给浏览器。这个过程成为渲染,下一节课我们详细介绍。
错误处理中间件何时会执行呢?当然是当错误发生时。你需要手动地将错误传递给错误处理中间件。不妨在app.js
中创建如下的中间件来测试错误处理:
// file: app.js
app.get('/throw/error', function(req, res, next){
var err = new Error('i am an error');
next(err);
});
访问localhost:3000/throw/error
,将会触发该控制器,进而触发错误处理中间件。中间件的第三个参数next
为下一个中间件。还记得吗?中间件是一个队列,如果一个中间件未能处理完该请求,请通过调用next()
来交给下一个中间件。
- 如果带不带参数调用(如
next()
)则会传递给下一个普通中间件; - 如果带参数调用(如
next(err)
)则会传递给下一个错误处理中间件。