我们说我已经定义了以下中间件和路由处理程序:
app.use(function(err,req,res,next) {
res.status(500).send('Something broke!');
});
app.get('/test',function(req,res) {
//some error happens here, and ther "error" object is defined
next(error);
});
是否会调用错误处理中间件?
如果没有,如果
,是否会调用错误处理中间件throw error;
代替next(error);
?或者我应该这样做:
//route.js
module.exports=function(req,res,next) {
//error happens here
next(error);
}
//errorHandler.js
module.exports=function(err,req,res,next) {
res.status(500).send('Something broke!');
}
//app.js
var route=require('route');
var errorHandler=require('erorHandler');
app.get('/test',[route,errorHandler]);
我现在有点困惑......
答案 0 :(得分:2)
中间件,app.get,app.post等的顺序事项,它们按照在代码中添加的顺序进行处理。
所以当你像你一样定义它时
app.use(function(err,req,res,next) {
res.status(500).send('Something broke!');
});
app.get('/test',function(req,res) {
//some error happens here, and ther "error" object is defined
next(error);
});
第一个中间件将捕获所有请求并返回状态500,因此它永远不会到达app.get('test'...
错误处理程序应始终位于代码的底部,因此如果某个路由处理程序中出现错误,则调用next(error)
,错误处理程序将使用您的res.status(500).send('Something broke!');
之类的消息响应客户端
这个
app.get('/test',[route,errorHandler]);
实际上很糟糕,因为你需要在每条路线中使用它
好:
app.get('/test',function(req,res,next) {
//some error happens here, and ther "error" object is defined
next(error);
});
app.use(function(err,req,res,next) {
res.status(500).send('Something broke!');
});
app.listen(8000);