Node.js错误处理——如何处理导致错误的未定义值
Node.js Error Handling -- how to deal with undefined values causing errors
以这个URL为例:https://api.eveonline.com/eve/CharacterID.xml.aspx?names=Khan
使用xml2jsnode.js模块,您可以解析该XML,尽管它看起来并不漂亮:
var CharacterID = response.eveapi.result[0].rowset[0].row[0].$.characterID;
该应用程序在运行2周后崩溃,这一切都是因为行集[0]未定义。在此之前,它崩溃是因为没有定义eveapi。说真的,我的if-else必须是这样吗?只是为了防止服务器因愚蠢的未定义对象错误而崩溃?
if (!response.eveapi ||
!response.eveapi.result[0] ||
!response.eveapi.result[0].rowset[0] ||
!response.eveapi.result[0].rowset[0].row[0]) {
return res.send(500, "Error");
除了明显的if (err) return res.send(500, "Error");
错误处理(如适用)外,未定义错误的一般做法是什么?
我为这种东西写了一个库,叫做dotty(https://github.com/deoxxa/dotty)。
在你的情况下,你可以这样做:
var dotty = require("dotty");
var CharacterID = dotty.get(response, "eveapi.result.0.rowset.0.row.0.$.characterID");
在路径不可解析的情况下,它只会返回undefined。
正如您所发现的,未定义本身并不是一个错误,但使用未定义作为数组/对象是一个错误。
x = {'a': { 'b': { 'c': { 'd': [1,2,3,4,5]} } } } ;
try { j = x.a.b.c.e[3] } catch(e) { console.log(e); }
打印
[TypeError: Cannot read property '3' of undefined]
这向我建议,try/catch可以与代码一起使用,以返回错误代码,如果需要,还可以返回错误文本(或者只将错误文本粘贴在console.log、数据库或本地文件中)。
在你的情况下,这可能看起来像:
var CharacterID; // can't define it yet
try {
CharacterID = response.eveapi.result[0].rowset[0].row[0].$.characterID;
} catch(e) {
// send description on the line with error
return res.send(500, "Error: NodeJS assigning CharacterID: "+e);
// return res.send(500, "error"); use this one if you dont want to reveal reason for errors
}
// code here can assume CharacterID evaluated. It might still be undefined, though.
也许这个函数有帮助?
function tryPath(obj, path) {
path = path.split(/[.,]/);
while (path.length && obj) {
obj = obj[path.shift()];
}
return obj || null;
}
对于您的代码,您将使用:
if (tryPath(response,'eveapi.result.0.rows.0.row.0') === null) {
return res.send(500, "Error");
}
jsFiddle示例
jsFiddle与示例相同,但作为Object.prototype
的扩展
相关文章:
- 是否存在Javascript Liferay Service库的文档?如何处理错误情况
- RxJS:在循环中处理错误.js自定义驱动程序
- 通过 AJAX 检索 Blob 时处理错误消息
- Chai正如承诺:当承诺抛出错误时,处理错误
- 如何处理错误'控制台未定义'在powershell中
- Bloodhound的新Typeahead是如何处理错误的
- 请求管道处理错误
- Angular Jasmine SpyOn$resource处理错误
- 如何或如何使用firebase有效地处理错误
- 以处理错误的方式启动javascript承诺蓝鸟链
- JavaScript Regex over CSS:如何处理错误的类
- 模态中的 Django 形式:动态重定向和处理错误
- 在 Angular 中使用拦截器处理错误的通用方法
- Angular JSON-RPC:处理错误
- AngularJS - 处理错误错误:[ng:areq] 在此特殊情况下 (?)
- 绕过 javascript 的 chrome 和 FF 后台选项卡处理错误
- 如何使用 Q 和 JS 捕获或失败来处理错误
- 使用 window.onerror 和 try-catch 块处理错误之间的差异
- jQuery $.get 在处理错误时返回白色错误页
- 处理错误后提交索引数据库事务