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

问题描述:

可以说我正在使用Express来构建一个简单的API来POST和GET客户对象。处理来自多个来源的响应错误

(请忽略语法,或任何表达特异性这仅仅是写在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. 有效的客户存在,并与空返回错误。

  2. MongoDB有一个错误,并将它发送给null客户的回调。

  3. 我定制的客户通过取景器ID方法有一个错误:

    一个。没有找到客户。

    b。客户被发现但不活跃。

如何处理用正确的错误发送响应? (如果没有一个开关或者混乱​​。)

  • 如果它是一个蒙戈的错误,我想送一个通用的500

  • 如果没有找到客户,我想送一个404友好的信息。

  • 如果找到客户但未激活,我想发送其他错误响应。

是否有一个一般的指导方针或最佳做法为这个sitauation?

预先感谢您!

所以,是的。一般来说,处理这个问题的最好方法是将自定义错误提示出来,然后让一些Express中间件以适当的方式处理这些错误。

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

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

不同的情况下仍然需要像你一样处理,但好处是你的控制器逻辑变得更简单,你只需要从客户渲染/发送数据,或者你回调了发送的错误。正如我所说的,一个通用的错误处理中间件然后可以接收这些错误,并检查它们的namestatus以决定如何处理它们,尽管根据我的经验,最简单的做法是让每个错误定义它自己的HTTP状态代码,这样你就不需要开关或者如果你描述的那样混乱。或者,如果你有一个if,你至少可以简化并用它来决定是否记录错误(大部分你会,但有些你可能不会)。一个观察,你在你的示例代码中将状态设置为201,但是如果你只是做一个查找,正确的代码是200;如果你真的创造了一件新事物,那么201就是正确的。

+0

我还没有测试这个。回复晚了非常抱歉。当我有一些东西被整理出来时,会回复。你的答案可能是这样,但我很犹豫是否关闭这个话题,因为如果没有问题,我可能会跟进问题。 – Andrew 2014-09-30 10:53:33