【问题标题】:Comprehensive conditional error messages全面的条件错误消息
【发布时间】:2013-03-08 13:18:46
【问题描述】:

当谈到抛出全面错误时,我很好奇人们如何生成长 if 语句而不为每种可能性抛出消息。

以下内容的好处:

if(typeof hello !== "undefined" && hello == 3){

}

这两个条件都是必要的。我尝试过使用数组和对象来处理 if 语句,如下所示。

var validate = [
    (typeof hello !== "undefined"),
    (hello == 3)
];

然后您可以使用类似underscore_.without() 函数来获取truefalse 值并检查是否有任何错误。上面这个数组的问题是,如果 hello 未定义,就会报错。

var validate = [
    (typeof hello !== "undefined"),
    (typeof hello !== "undefined" && hello == 3)
];  

所以我必须这样做,这是非常重复的。

到目前为止,这些例子还没有得到任何回应。我刚想出这个。

var valid = [
    (_.isObject(email)) ? false : "email is not object",
    (dotty.exists(email, "event")) ? false : "event does not exist",
    (email.event == "inbound") ? false : "event is not set to inbound",
    (dotty.exists(email, "ts")) ? false : "ts does not exist"
];
var errors = _.without(valid, false);
if(errors.length == 0) // no errors

哪个更进步。

var valid = [
    (_.isObject(email)) ? false : "email is not object",
    (dotty.exists(email, "event")) ? false : "event does not exist",
    (dotty.exists(email, "event") && email.event == "inbound") ? false : "event is not set to inbound",
    (dotty.exists(email, "ts")) ? false : "ts does not exist"
];
var errors = _.without(valid, false);
if(errors.length == 0) // no errors

但我仍然需要详细说明。

这一切都带来了下一个想法。

有两个要处理的错误。

  1. 当出现错误时,在继续之前处理该错误
  2. 显示所有错误

我更喜欢后者。

是否存在任何库来帮助复杂的 if 语句进行验证?

更新

因为下一个语句与前一个无关,有时这很好,我陷入了一个疯狂的斜坡。

一定有办法防止这种情况发生……

typeof email !== "undefined"
typeof email !== "undefined" && _.isObject(email))
typeof email !== "undefined" && _.isObject(email)) && dotty.exists(email, "event"))
typeof email !== "undefined" && _.isObject(email)) && dotty.exists(email, "event")) && email.event == "inbound"

v.s 易于阅读

typeof email !== "undefined"
_.isObject(email))
dotty.exists(email, "event"))
email.event == "inbound"

我希望它更简单并且没有斜率。在下面的示例中,假设 emailundefinedcolor 是并且它等于 yellow。我很想看到以下错误报告

(typeof email !== "undefined") ? false : "no email",
(_.isObject(email)) ? false : "email isn't object",
(dotty.exists(email, "event")) ? false : "event not present",
(email.event == "inbound") ? false : "event not inbound",
(typeof color !== "undefined") ? false : "no color",
(color == "yellow") ? false : "color not yellow",

[
    "no email",
    "email isn't object",
    "event not present",
    "event not inbound",
    false,
    false       
]

换句话说,我希望颜色不会作为错误返回,因为它是有效的。但我想返回所有其他错误。

或者我只需要:

[
    "no email",
    false,
    false
]

如果 coloremail 都未定义,我不想看到:

[
    "no email"
]

这是误导。我至少想看看

[
    "no email",
    "no color"
]

或全部

[
    "no email",
    "email isn't object",
    "event not present",
    "event not inbound",
    "no color",
    "color not yellow"
]

更多倾斜示例:

var valid = [
    (typeof email !== "undefined") ? false : "email is undefined", // halt the code 
    (typeof email !== "undefined" && _.isObject(email)) ? false : "email is not object",
    (typeof email !== "undefined" && dotty.exists(email, "event")) ? false : "event does not exist",
    (typeof email !== "undefined" && dotty.exists(email, "event") && email.event == "inbound") ? false : "event is not set to inbound",
    (typeof email !== "undefined" && dotty.exists(email, "ts")) ? false : "ts does not exist"
];
var errors = _.without(valid, false);
if(errors.length == 0) // no errors

【问题讨论】:

  • 您是否正在尝试自动调用验证脚本,同时保持每个无效条件的详细程度?
  • @JaredFarrish 我想是的。
  • 这听起来就像您在谈论rules engine(注意,这是Java,但概念适用)。所以你可能会寻找 Javascript 规则引擎,也许是JSON Rules?也许Node.js nools 可能有用。
  • @JaredFarrish 这些是非常有趣的资源。非常感谢。我想与你分享我想到的一个想法,即使用对象并在下一个 if 语句中引用它们。节省空间并提供出色的错误响应。 gist.github.com/reggi/5202723
  • 这个nools example 看起来真的与您正在前往的地方相似。

标签: javascript validation error-handling conditional


【解决方案1】:

根据 cmets 中的建议,nools 是一个非常有趣的资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    相关资源
    最近更新 更多