javascript - Express.js : Does calling next(error) from a route handler call a global error handling middleware?

标签 javascript node.js express error-handling routes

假设我已经定义了以下中间件和路由处理程序:

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/

相关文章:

javascript - Google Maps API v3 不会在 map 加载后禁用滚轮

javascript - 如何在 firebase 中添加数据?

javascript - Ajax - 在发送请求之前检查 url 是否存在的函数

mysql - Angular,从 mySql 数据库中存储的电子邮件验证用户

javascript - 如何在同一个对象中调用一个对象的函数?

javascript - 类型错误 : Cannot read property 'state' of undefined

mysql - 如何在反对js中使用find_in_set?

sockets - NodeJS发送字符串

javascript - 重定向到另一个页面: NodeJs

asp.net-mvc - node.js/expressjs/ejs中的StyleBundle和ScriptBundle等价于什么?