我在Express中有这个POST路由处理程序。我担心使用一个大的try / catch块不能正确捕获其中发生的所有错误。
在下面唯一的try / catch块中,我尝试访问嵌套的本机JS属性 - 即--scheded.template.list.push(listItem);
所以我试图将对象推送到嵌套属性中的数组上。如果模板不存在,它将导致运行时错误,但这不会被try / catch捕获,服务器完全停止,并且不会发送JSON响应。
有没有办法改进我的代码 - 我是否需要在我的代码中添加无数的尝试/捕获以尝试缺席保护所有内容?
POST: function (req, res, next) {
var incidentId = req.body.incident_id;
if (incidentId) {
csDataHelper.getAccountNumWithIncidentCorrelationID(incidentId, function (err, response, body) {
if (err) {
return res.json({error: err.toString()});
}
try { // big try/catch starts here
var body = JSON.parse(body);
var result = csDataHelper.parseInfoFromCSResponse(body);
if (!(result instanceof Error)) {
var accountNum = result.accountNum;
var homePhone = result.homePhone;
var altPhone = result.altPhone;
var absPath = path.resolve(nconf.get('globalRoot').concat('/json_response_templates/pay_by_phone.json'));
fs.readFile(absPath, 'utf8', function (err, jsonTemplate) {
if (err) {
res.json({'error': err.toString()});
}
else {
var str = jsonTemplate.replace('${accountNumber}', accountNum).replace('${incidentId}', incidentId);
var parsed = JSON.parse(jsonTemplate);
if (homePhone) {
var listItem = {
"label": homePhone,
};
parsed.template.list.push(listItem);
}
if (altPhone) {
var listItem = {
"label": altPhone,
};
parsed.template.list.push(listItem);
}
res.json(parsed);
}
});
}
else {
return res.send({error: 'no accountNumber sent to Baymax from Contextstore ->' + result});
}
}
catch (err) {
return res.json({error: err.toString()});
}
});
}
else {
res.send({error: 'null/empty incident_id posted to Baymax'});
}
}
}
当try / catch中的某些代码遇到错误时,try / catch块不会捕获错误。特别是,我知道在某些情况下" parsed.template.list.push(listItem);"实际应该是" parsed.list.push(listItem);",取决于JSON的性质。
换句话说,在JS中,在使用嵌套的JSON.parse调用或嵌套的JS对象属性检索时,是否需要使用嵌套的try / catches?
坦率地说,这非常危险,而且我在Node.js中看到的所有内容,解析JSON和遍历本机JS对象都会对服务器正常运行时间造成一些最大的威胁。
如何打击这个?
答案 0 :(得分:1)
它在parsed.template.list.push(listItem)
上崩溃的原因是因为该行位于异步函数调用的回调中。 try-catch块不会神奇地覆盖回调。
因此,目前最好的办法是在回调中添加try-catch或添加类似if (parsed.template && parsed.template.list) { .. }
的条件。