在回调中,我构建了一个我构建的对象,用于在我的Express应用程序中发送:
this.response = {
owner: data.actions[1].causes[0].shortDescription,
build_version: data.actions[0].parameters[0].value,
branch_to_merge: data.actions[0].parameters[1].value,
jira_tickets: data.actions[0].parameters[2].value,
build_description: data.actions[0].parameters[3].value,
outcome: data.result
};
如果我得到的响应与我以前的响应不同,我会收到导致我的服务器崩溃的致命cannot find 'property' of undefined
错误:data.actions[1].causes[0].shortDescription
。
我想知道该怎么办,我想我可以把它放在try catch
中,但这似乎不对。
什么被认为是解决这个问题的好方法?
答案 0 :(得分:2)
在你的陈述中,你有:
这就是try / catch处理得最好的。从一个代码块中处理相同类型的错误并在一个地方处理。因此,除非您想单独处理每个潜在错误,否则尝试/ catch是您可以使用的最简单,最好的工具。它有效并且您可以查明问题:
var w = {}
try {w.x.y.z} catch(e) {e}
TypeError:无法读取属性' y'未定义的(...)
或者,如果您需要更多控制权,可以
如果即使某些属性失败也必须成功,您可以检查每个引用。 e.g:
var sdValid = data &&
data.actions &&
data.actions.length>1 &&
data.actions[0].causes &&
data.actions[0].causes.length &&
data.actions[1].causes[0].shortDescription;
var owner = sdValid
? data.actions[1].causes[0].shortDescription
: 'default value';
this.response = {
owner : owner,
// etc...
}
如果你
,你可以轻松使其更具可读性this.response = {
owner : nestget(data, 'nobody')
.prop('actions', 1)
.prop('causes', 0)
.prop('shortDescription')
.value(),
// return shortDescription if you got this far or 'nobody'
build_version : nestget(data, '0.0.0')
.prop('actions', 0)
.prop('parameters', 0)
.prop('value')
.value(),
// return value if you got this far or '0.0.0'
// ... etc
};
// Custom - easy to use reference checker
function nestget (obj, default) {
var valid = false;
this.default = default;
this.obj = obj;
var that = this;
return {
prop : propChecker,
value : getValue
}
function propChecker (prop, i) {
// implementation omitted for brevity
}
function getValue () {
return value;
}
}
最后但并非最不重要的是,您始终可以使用库。我个人喜欢XPath搜索XML树,所以我建议使用JSONPath之类的东西来搜索数据结构中的嵌套对象。 e.g。
this.response = {
owner : jsonpath(data, '$..shortDescription[0]'),
build_version jsonpath(data, '$.actions[0].parameters[0].value'), // no error
// ... etc
}
但是,有很多选项(例如评论中提到的lodash / underscore)。
答案 1 :(得分:0)
try {
//unwrap your data
}
catch(err) {
//handle the failure
}
是一个很好的解决方案,取决于你想要的细微差别
如果您想继续执行,即使一个或多个失败,您也可以考虑条件赋值运算符
javascript: is this a conditional assignment?
this.response = {
owner: data.actions[1].causes[0].shortDescription || undefined,
etc: data.something || undefined
};
当然,你必须确保处理this.response上游的东西不会因为同样的原因而爆炸。
编辑:以上不适合我,虽然我认为这是javascript的一个功能。如果你不能使它工作,你可以用三元运算符
完成同样的事情var asdf = (jkl == undefined) ? 3 : jkl;
其中说
if(asdf == undefined) asdf = 3; else asdf = jkl
问题在于,如果你这样做
var asdf = (nested.variable == undefined) ? 3 : nested.variable;
如果nested
为undefined
,您的代码就会中断。有一些解决方法,例如设置一些标志然后调整三元组。
我已经听到(并同意)嵌套的三元陈述不是一个好主意。
另一个编辑:
请查看此处How to determine if variable is 'undefined' or 'null'?,了解有关可能定义或未定义的变量的问题。
显然== undefined
和== null
仅在声明变量但未定义变量时才起作用。
实际上,我认为这就是你的情况。如有疑问,请使用typeof
。