以此网址为例: https://api.eveonline.com/eve/CharacterID.xml.aspx?names=Khan
使用 xml2js node.js模块,您可以解析该XML,虽然它看起来不漂亮:
var CharacterID = response.eveapi.result[0].rowset[0].row[0].$.characterID;
应用程序在运行2周后崩溃,原因是 rowset [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");
错误处理外, undefined 错误的一般做法是什么?
答案 0 :(得分:4)
我为这种事写了一个名为dotty(https://github.com/deoxxa/dotty)的文库。
在您的情况下,您可以这样做:
var dotty = require("dotty");
var CharacterID = dotty.get(response, "eveapi.result.0.rowset.0.row.0.$.characterID");
如果路径不可解析,则只返回undefined。
答案 1 :(得分:3)
正如您所发现的,undefined本身不是一个错误,但使用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.
答案 2 :(得分:1)
也许这个功能有帮助吗?
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");
}
的扩展名