处理来自多个来源的响应错误

时间:2014-09-22 17:02:52

标签: javascript node.js rest express

假设我使用Express构建一个简单的API来POST和GET客户对象。

(请忽略语法或任何特定于Express的内容。这只是用SublimeText编写的自由格式来解释我的问题。)

在我的路线中,我调用的方法看起来像这样:

// Main Express index.js server file.
function getCustomer(req, res, next) {
    var q = request.query;
    Customer.findByCustomerId(q.customerId, function(error, customer) {
        if (error) { // No idea if this is a Mongo Error, NotFound Error, InactiveError, something else from some other part of the app!
            res.send("??????");
            return next();
        }
        res.send(201, customer.JSONResponse());
        return next();
    });
}

// Customer.js Mongoose Model in separate file.
Customer.statics.findByCustomerId = function(customerId, callback) {
    this.findOne({customerId : customerId}, function(error, foundCustomer) {
        if (error) { // MONGO ERROR, Something is really broken.
            return callback(error, null);
        }
        if (!foundCustomer) { // Didn't find a customer so lets send that back.
            return callback(new Error("No customer found"), null);
        }

        if (foundCustomer.status == "inactive") { // Lets just say a customer being inactive is error worthy.
            return callback(new Error("The customer you have specified is inactive"), null);
       }

        return callback(null, foundCustomer);
    });
};

这里可能会发生以下几件事:

  1. 存在有效客户,并返回null错误。

  2. MongoDB发生错误并将其发送给null customer的回调。

  3. 我的自定义客户查找程序ID方法有错误:

    一个。没有找到客户。

    湾找到了客户但未激活。

  4. 如何使用正确的错误处理发送响应? (没有开关或乱七八糟。)

    • 如果它是mongo错误,我想发送一个通用500.

    • 如果找不到客户,我想发送一条带有友好信息的404。

    • 如果找到客户但未激活,我想发送一些其他错误回复。

    这种情况是否有一般指导原则或最佳做法?

    提前谢谢!

1 个答案:

答案 0 :(得分:1)

所以,是的。通常,处理此问题的最佳方法是将自定义错误冒出来,然后使用一些Express中间件以适当的方式处理这些错误。

例如,您可以创建一个new Error("No customer found");而不是RecordNotFoundError,然后实例化并抛出。这使得错误处理中间件变得更容易。例如,您的Error子类可以实现直接映射到您要发送的HTTP状态代码的代码或状态属性(用于一致的中间件处理)。

我还要确保你以正确的方式封装你的逻辑。对我来说,活跃的'客户上的标志应该只是一个过滤条件。如果它是您只想看到活跃人的默认情况,那么对我来说,这应该与记录未找到的情况没有什么不同。也就是说,如果您因某种原因确实希望它成为自己的错误,那么创建一个CustomerNotActiveError子类并确定您认为合适的HTTP状态代码。

不同的情况仍然需要像你一样处理,但好处是你的控制器逻辑变得更简单,你只需要从客户渲染/发送数据,或者回调一下发送的错误。正如我所说的,一般的错误处理程序中间件可以接收这些错误并检查他们的namestatus以决定如何处理它们,尽管根据我的经验,最简单的方法是让每个错误都定义了它自己的HTTP状态代码,这样你就不需要切换或者像你描述的那样混乱。或者如果你有一个if,你至少可以简化并使用它来决定是否记录错误(大多数你会,但有些你可能不会)。

有一种观察,您在示例代码中将状态设置为201,但如果您只是进行查找,则正确的代码为200;如果您真正创建新事物,那么201将是正确的。