【问题标题】:Expressjs - Handling Errors With MiddlewareExpressjs - 使用中间件处理错误
【发布时间】:2015-02-01 03:29:34
【问题描述】:

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

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

【问题讨论】:

    标签: node.js express error-handling


    【解决方案1】:

    除了手动创建 错误,您可以像下面那样委派该错误。

    return next(err);
    

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

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

    你可以在上面的路由中看到 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  : {}
        });
    
    });
    

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

    【讨论】:

    • 但是 err 不会有 status 除非我手动设置它,否则它会像我的问题一样吗? - 以及我试图避免的那三行,因为我必须为每个错误都这样做。
    • 并非每个错误都带有状态。但是您使用的是callbacks,或者您不是!
    • 是的,我正在使用回调
    • 问题是我需要为 MissingToken 和 TokenNotFound 等创建错误
    • 如果您想为所有其他错误设置状态代码,您必须手动完成并按照我提到的工作流程委派该错误。对于此类错误,我们使用 500 状态代码。
    【解决方案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?

    【讨论】:

    • 如果您不需要堆栈跟踪,您可以省略 this.stack 部分,但有时它非常有用
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2014-03-20
    • 2017-04-07
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多