gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:47:45 25 4
gpt4 key购买 nike

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

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

在我的 route ,我调用了一个如下所示的方法:

// 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 有错误,并将其发送到空客户的回调。

  3. 我的自定义客户查找器通过 id 方法出现错误:

    a.未找到客户。

    b.已找到客户,但不活跃。

我如何处理发送带有正确错误的响应? (没有开关或者如果困惑。)

  • 如果是 mongo 错误,我想发送通用 500。

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

  • 如果找到客户但不活跃,我想发送一些其他错误响应。

针对这种情况是否有一般准则或最佳实践?

提前谢谢您!

最佳答案

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

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

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

不同的情况仍然需要像您一样进行处理,但好处是您的 Controller 逻辑变得更简单,您只需渲染/发送来自客户的数据,或者回调发送的错误。正如我所说,通用错误处理程序中间件可以接收这些错误并检查它们的名称或状态来决定如何处理它们(如果您愿意),尽管根据我的经验,这是最简单的要做的事情是让每个错误定义它自己的 HTTP 状态代码,这样您就不需要开关或像您描述的那样困惑。或者,如果您确实有一个 if,您至少可以简化并使用它来决定是否记录错误(大多数情况下您会这样做,但有些您可能不会)。

根据观察,您在示例代码中将状态设置为 201,但如果您只是进行查找,则正确的代码是 200;如果你真的在创造一个新事物,201 是正确的。

关于javascript - 处理来自多个来源的响应错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25979402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com