嵌套的JSON.解析错误和JS对象遍历错误没有被JS的try/catch捕获,崩溃服务器
Nested JSON.parse errors and JS object traversal errors not trapped by JS try/catch, crashes server
我有这个POST路由处理程序在快递。我担心使用一个大的try/catch块不能正确地捕获其中发生的所有错误。
在下面唯一的try/catch块中,我尝试访问一个嵌套的原生JS属性-正在被解析。template.list.push(listtitem);
所以我试图将对象推到嵌套属性中的数组上。如果模板不存在,它将导致运行时错误,但这不会被try/catch捕获,服务器只是完全停止,并且不发送JSON响应。
是否有一种方法来改进我的代码-我是否需要在我的代码中放置无数的try/catch来试图心不在焉地保护一切?
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(listtitem);"实际上应该是"parsed.list.push(listtitem);",这取决于我收到的JSON的性质。
换句话说,在JS中,当使用嵌套JSON时,我需要使用嵌套的try/catch吗?解析调用或嵌套的JS对象属性检索?
坦率地说,这是相当危险的,在我在Node.js中看到的所有事情中,解析JSON和遍历原生JS对象对服务器正常运行时间构成了一些最大的威胁。
如何解决这个问题?
它在parsed.template.list.push(listItem)
上崩溃的原因是因为该行在异步函数调用的回调中。Try-catch块不会神奇地覆盖回调。
所以你现在最好的选择是在回调或中添加一个try-catch,如if (parsed.template && parsed.template.list) { .. }
。
- Node.js错误“;ReferenceError:全局未定义“;在从0.10.2更新到0.12.2之后
- 最短路径算法js错误
- Modx数据包管理器ext-all.js错误
- Dropzone引导JS错误
- JS错误导致WordPress插件无法工作
- Date.js错误地分析了ISO 8601 UTC日期
- Ember.js错误“;无法读取属性'容器'未定义的“;使用液体火时
- React.js错误;相邻的JSX元素必须被封装在一个封闭标记“中;
- 获取意外的令牌ILLEGAL JS错误
- 使用动画时出现反应JS错误
- IE8 中未知的 JS 错误
- Angular JS错误:仅在IE 10和IE 11中出现[$rootScope:infdig]
- Meteor JS错误”;ReferenceError:X未定义”;
- Node.js错误:参数太多上传批量数据时出错
- CKEditor选项startupMode导致js错误
- 在出现JS错误的页面上运行外部Javascript
- angular js:错误:$没有在http文章中定义
- 使用JS检测所有JS错误
- Firebug不再显示JS错误
- require.js错误(topojson未加载)