在express生成的标准模板中,发生错误(404和其他错误)时,为什么会执行以下代码?当使用try catch时,catch会触发通用的error handler方法?
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
我们来看下文档:
因此示例代码里调用
next(err)
将使得 Express 调用错误处理中间件。至于如何判断一个中间件是不是错误处理中间件?Express 会对中间件 fn 的参数个数进行判断,如果参数个数不等于 4 则认为不是错误处理中间件,则继续调用
next(err)
,这样就会进入到下一个中间件函数,继续进行参数个数判断,如此方式一直到某个中间件函数的参数个数是 4,就认为找到了错误处理中间件,然后执行此中间件函数。另外,使用 try catch 会不会触发错误处理中间件取决于你是否调用
next(err)
。