Expressjs – 使用中间件处理错误

我正在构build一个API(使用Expressjs v4),通常我已经处理了路由中的错误,而不是使用中间件。 例如:

router.use('/', function(req, res, next) { ... if (err) return res.status(500).send({type: "serverError", message: "Something has gone wrong on our end."}); } 

我现在意识到中间件是“走的路”。 我在这里看到了Expressjs站点上相当有限的文档: http ://expressjs.com/guide/error-handling.html,但仍然不确定一些事情。

我已经在server.js添加了:

 function errorHandler(err, req, res, next) { } 

但我应该如何处理不同types的错误(400,404,500等)?

每当发生错误时,我发现自己正在写3行代码:

 //A route var err = new Error(); err.status = 404; return next(err); 

我可以使用以下方式访问状态:

 function errorHandler(err, req, res, next) { console.log(err.status); if(err.status == "400") //do something else //etc etc } 

当然有比这更简单的方法? 我错过了什么吗?

您应该创build自己的错误types,使您可以提供所有必要的信息来处理错误。

 var util = require('util'); function HttpError(message, statusCode){ this.message = message; this.statusCode = statusCode; this.stack = (new Error()).stack; } util.inherits(Error, HttpError); module.exports = HttpError; 

然后在你的代码中包含新的错误对象并使用它

 next(new HttpError('Not Found', 404)); 

或者你可能会发疯,并为预填充statusCode部分的每个响应代码实现一个错误types。

参考: 在JavaScript中扩展错误的好方法是什么?

相反,手动创build错误 ,你可以委托像下面的错误。

 return next(err); 

而你的错误将深入到所有定义的路由,直到find具有低于签名的路由。

 app.use(function (err, req, res, next) { }); 

你可以在上面的path中看到err参数。

理想情况下,您可以在开发和生产环境下使用以下两种方法。

 if (process.env.NODE_ENV === 'development') { app.use(function (err, req, res, next) { res.status(err.status || 500); logger.log('info', err.message + " expected URL was " + req.url); res.status(err.status).send(err.status, { message: err.message, error : err }); }); } app.use(function (err, req, res, next) { res.status(err.status || 500); logger.log('error', err.message + " expected URL was " + req.url); res.status(err.status).send(err.status, { message: err.message, error : {} }); }); 

你可以在那里捕获实际填充的错误对象。