gpt4 book ai didi

javascript - 处理 JavaScript 中两层之间的错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:05:48 25 4
gpt4 key购买 nike

我有一个使用express和3层( Controller 、API和模型)的node.js应用程序。

Controller 要求 API 层发布、编辑或添加对象(promise 样式)。 API 验证并执行请求(使用模型层 (mongoose))。 Controller 必须通过呈现错误页面或闪存消息来告诉客户端其请求是否已被接受。这是一个显示主要结构的小图表。

app structure chart

这是一个例子:

Controller:

exports.doEdit = function(req, res) {
var args;
args = req.body;
return app.api.mods.edit(req.getUserId(), req.params.id, args.name, args.value).then(function(status) {
return res.send(200, "Saved!");
}).fail(function(err) {
return res.send(400, err.message);
});
};

API Layer:

/*
Edit a mod
@param userid the current logged user id
@param slug the slug of the mod
@param field the field to be edited
@param value the new value
@permission mod:edit
*/


exports.edit = (function(userid, slug, field, value, callback) {
return canThis(userid, "mod", "browse").then(function(can) {
var Mod;
Mod = mongoose.model("Mod");
return Mod.findOne({
slug: slug
}, function(err, mod) {
if (can === false && mod._id !== userid) {
return callback(new Error("unauthorized"));
}
if (err || !mod) {
if (err) {
console.log(err);
}
return callback(new Error("Please try again"));
}
mod[field] = value;
mod.save();
return callback("ok");
});
});
}).toPromise(this);

如何针对错误进行简单、灵活、干净的沟通?

我想添加一个像这样的 JSON 对象

{
status: "error",
code: "404",
id: "not_found",
message: "Not found"
}

但是如何将其添加到只需要一条消息的错误中呢?它灵活且“干净”吗?

整个项目可以在这里看到:https://github.com/CraftYourModCorporation/OpenCubes

最佳答案

如果我理解正确,您是在询问如何使用足够的信息将错误传播给客户端。

首先,javascript 是动态的,因此您只需将所需的属性添加到 Error 实例中,然后再将其传递给回调/响应即可。

    if (can === false && mod._id !== userid) {
var error = new Error("unauthorized")
error.code = 401
error.id = "not_authorized"
return callback(error);
}

不要忘记,在关注点分离的问题上,每一层都有自己的语义,并且必须封装较低的层。对于错误处理也是如此。有时让错误冒出来是合适的,但在大多数情况下这很糟糕,或者至少是糟糕的用户体验。因此,至少在 Controller 中,您应该将此处出现的任何错误转换为用户/客户端友好的 http 错误代码。为此,您必须考虑错误对上一层意味着什么。

因此像 res.send(404, err.message) 这样的代码很简单,但不是很有帮助。如果您确实想进行良好的错误处理,那么您必须更进一步并在此处进行一些匹配。在 Java 等静态类型语言中,您可以对 Type 进行匹配。对于 JS 这也是可能的(使用 instanceof),但这不是很可靠。但是您可以使用所有其他属性或引入具有明确定义的错误类型的自己的属性。

    var error = new Error("Some lengthy message for humans, who are reading log files")
error.errType = require('./errorTypes').NOT_AUTORIZED
callback(error)

以及 API 用户代码

    if(err){
if(err.errType === errorTypes.NOT_AUTHORIZED)
return res.send(401, "Wrong credentials")
}

为了减少代码重复,您可以将错误匹配提取到自己的模块或简单函数中,将内部类型映射到外部。

所以这很简单(与简单不同,简单取决于您的上下文),并且从回调样式代码的意义上来说它是干净的。这对于基于 Promise 的 api 也是有效的,只是在那里你有错误传播以及解析和拒绝控制流的分离。

我没有介绍像 Node.js 域(因为它们不容易与 Express 一起使用)和 Zone.js 之类的东西。这个东西可能会带来另一个用于错误处理的工具链,但本质上它仍然是相同的。您必须在某处转换错误。

关于javascript - 处理 JavaScript 中两层之间的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23180772/

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