Express.js:从路由处理函数调用下一个(错误)是否调用全局错误处理中间件?
问题描述:
比方说,我已经定义了以下中间件和路由处理程序:Express.js:从路由处理函数调用下一个(错误)是否调用全局错误处理中间件?
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);
});
Doe的错误处理中间件被调用?
如果不是,将错误处理中间件如果
- 错误处理中间件被下面的路由处理程序定义的叫什么?我用
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]);
我现在有点糊涂了......
答
中间件的顺序,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]);
是actualy不好,因为你需要在每一个航线使用它
好:
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);
啊,所以未来(错误)将进入错误处理中间件,即使它没有在路线中定义“下一个”是什么? – Alex
对不起,这是一个错误,'next'必须在回调函数app.get('/ test',function(req,res,next)'否则会出错'“next”不是函数' – Molda
''下一个(错误)''会用''req,res,next''签名忽略中间件,并用'err,req,res,next''签名直接进入下一个中间件? – Alex