假设我已经定义了以下中间件和路由处理程序:
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]);
我现在有点困惑...
最佳答案
中间件、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('东西坏了!');
还有这个
app.get('/test',[route,errorHandler]);
实际上很糟糕,因为你需要在每条 route 使用它
好:
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);
关于javascript - Express.js : Does calling next(error) from a route handler call a global error handling middleware?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40575273/