Expressjs - 处理中间件的错误

时间:2014-12-03 14:14:42

标签: node.js express error-handling

我正在构建一个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) {

}

但我该如何处理不同类型的错误(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
}

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

2 个答案:

答案 0 :(得分:2)

您应该创建自己的错误类型,以便提供处理错误所需的所有信息。

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部分的每个响应代码实施错误类型。

参考:What's a good way to extend Error in JavaScript?

答案 1 :(得分:2)

而是手动创建错误,您可以像下面一样委托该错误。

return next(err);

并且您的错误将深入到定义的所有路线,直到找到具有以下签名的路线。

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

});

您可以在上述路线中看到错误参数。

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

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  : {}
    });

});

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