Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js错误处理——如何处理导致错误的未定义值_Javascript_Node.js_Error Handling_Xml Parsing_Express - Fatal编程技术网

Javascript Node.js错误处理——如何处理导致错误的未定义值

Javascript Node.js错误处理——如何处理导致错误的未定义值,javascript,node.js,error-handling,xml-parsing,express,Javascript,Node.js,Error Handling,Xml Parsing,Express,以这个URL为例: 使用node.js模块,您可以解析该XML,尽管它看起来并不漂亮: var CharacterID = response.eveapi.result[0].rowset[0].row[0].$.characterID; 该应用程序在运行两周后崩溃,全部原因是行集[0]未定义。在此之前,它崩溃是因为未定义eveapi。说真的,我的if-else必须是这样才能防止服务器因为愚蠢的未定义对象错误而崩溃吗 if (!response.eveapi || !respon

以这个URL为例:

使用node.js模块,您可以解析该XML,尽管它看起来并不漂亮:

var CharacterID = response.eveapi.result[0].rowset[0].row[0].$.characterID;
该应用程序在运行两周后崩溃,全部原因是行集[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)返回res.send(500,“Error”)错误处理如果适用,未定义错误的一般做法是什么?

正如您所发现的,未定义本身不是错误,但将未定义用作数组/对象是错误

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.

我为这种东西写了一个库,叫做dotty()

在您的情况下,您可以这样做:

var dotty = require("dotty");

var CharacterID = dotty.get(response, "eveapi.result.0.rowset.0.row.0.$.characterID");

如果路径不可解析,它只会返回未定义的路径。

这个函数是否有帮助

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");
}
示例

同一个示例,但作为对
Object.prototype

的扩展,如果您了解了响应是什么,就不应该有这个问题。您始终可以创建一个函数,该函数接受任何数量的参数,这些参数通过对象进行查看,基本上执行
if
语句,因此您不必重写那么长的if语句statement@Ian因为[]可以用于取消对对象或数组的引用,所以这当然是可能的。我想大多数人都不太习惯变量参数函数,所以如果暮光之城想知道答案,也许你可以写一个例子?@Paul我不知道这是不是一个好例子,或者它能被广泛使用,但我得到的是:。希望它能在某种程度上帮助行动是的,我以为你就是这么做的。仍然需要在try/catch中调用以分支并返回错误响应。您可能会编写数百个try/catch。。难道没有一个最好的解决方案来抓住所有可能出现的问题,并以某种方式处理它们吗?我读了一些关于使用
域的内容,但我不理解它是如何工作的。try/catch可以在函数中用于提供常见操作。没有人被迫复制数百个try/catch。只有在错误处理需要不同的时候才写一个新的。你是什么意思?为了保护由许多函数组成的代码的每个部分,需要用try/catch来包装函数的每个内容,因为任何部分都有被破坏的风险,一个try/catch可以覆盖多个语句,但在错误发生后它将放弃这些语句并跳转到catch。如果您有一系列函数,并且希望在整个系列中应用常见的错误处理,则可以将这些函数嵌入到数组中,并使用内部循环中的try/catch循环该数组,以将错误转移到错误处理程序。但是异常的全部意义在于承认,对于可能出现的所有问题,没有最佳的解决方案,有些问题可能严重到可以停止并打印错误,这是最简单的try/catch用例。