处理来自多个来源的响应错误
Handling response errors from multiple sources
假设我正在使用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);
});
};
这里可能会发生几件事:
存在有效的客户,返回时出现null错误。
MongoDB有一个错误,并将其发送给具有null customer的回调。
我的自定义客户查找id方法有一个错误:
a。未找到客户。
b。已找到该客户,但该客户未处于活动状态。
如何处理发送带有正确错误的响应?(没有开关或混乱。)
如果这是一个mongo错误,我想发送一个通用的500。
如果找不到客户,我想发一条404友好消息。
如果找到了一个客户,但没有激活,我想发送一些其他错误响应。
对于这种情况,是否有一个通用的指导方针或最佳实践?
提前谢谢!
所以,是的。通常,处理这一问题的最佳方法是弹出自定义错误,然后使用一些Express中间件以任何合适的方式处理这些错误。
因此,例如,您可以创建一个RecordNotFoundError
,然后实例化并抛出它,而不是new Error("No customer found");
。这使得错误处理中间件更加容易。例如,Error
子类可以实现一个代码或状态属性,该属性直接映射到您想要发送的HTTP状态代码(用于一致的中间件处理)。
我也会确保你以正确的方式封装你的逻辑。对我来说,客户的"活动"标志应该只是一个筛选标准。如果默认情况下你只想看到活跃的人,那么对我来说,这应该与找不到记录的情况没有什么不同。也就是说,如果你真的出于某种原因想让它成为自己的错误,那么创建一个CustomerNotActiveError
子类,并决定你认为合适的HTTP状态代码。
不同的情况仍然需要像您那样处理,但好的是,您的控制器逻辑变得更简单了,您只需呈现/发送来自客户的数据,或者使用发送的错误进行回调。正如我所说,一个通用的错误处理中间件可以接收这些错误,并检查它们的name
或status
,以决定如果你愿意如何处理它们,尽管根据我的经验,最简单的方法是让每个错误定义自己的HTTP状态码,这样你就不需要像你描述的那样切换或混乱。或者,如果你有一个if
,你至少可以简化并使用它来决定是否记录错误(大多数人会,但有些人可能不会)。
一个观察结果是,您在示例代码中将状态设置为201,但如果您只是进行查找,则正确的代码为200;如果你真的在创造一个新事物,那么201是正确的。
- "所请求的名称已经作为不同类型的“”存在;HTTP 409响应错误
- 使用来自AngularJS的Web API JSON响应-错误:应为和数组,但得到了一个对象
- Json响应错误Json.parse:意外的数据结束错误
- AngularJs-$httpProvider.interceptors多重响应错误
- 使用ajax的ReCaptcha响应错误
- 节点服务器响应错误: process.nextTick(function(){throw err;});.
- 为什么我在使用 .then() 的 AngularJS 工厂中没有得到正确的响应/错误
- 在 MEAN Web 应用程序中,从 Express(服务器端)发送 HTTP 响应错误 403、500,未在 Angu
- E_UNKNOWN beforeCreate 和其他生命周期回调的响应错误
- 处理 HTTPS 文件响应错误
- 防止 Internet Explorer 中的“无响应”错误
- Backbone.sync 获取所有响应错误状态代码
- 如何防止“无响应”错误
- 收集后POST响应错误.插入NodeJS Mongo模块
- 处理来自多个来源的响应错误
- 在角度中,如果服务器响应{错误:'ok'},则$http去捕获
- Express BodyParser响应错误的请求,状态为400
- 发送ajax请求时获取响应错误
- Webdriver/FXDriver utils.js导致脚本无响应'错误
- worldweatheronline API响应错误