Javascript &引用;无法读取'&书信电报;propName>';“未定义”的定义;即使它';定义
我在NodeJS上遇到了一个非常奇怪的Javascript错误 我有一个巨大的data.json文件(24MB)。我是通过互联网读的Javascript &引用;无法读取'&书信电报;propName>';“未定义”的定义;即使它';定义,javascript,node.js,undefined-behavior,Javascript,Node.js,Undefined Behavior,我在NodeJS上遇到了一个非常奇怪的Javascript错误 我有一个巨大的data.json文件(24MB)。我是通过互联网读的 var data = JSON.parse(fs.readFileSync("./data.json", 'utf8')); 但是,在脚本执行过程中的某个时刻,我尝试访问,例如 data['someProp']['prop1'] 它会引发一个类型错误: TypeError:无法读取未定义的属性“prop1” 这真的很奇怪,因为数据,数据['someProp']
var data = JSON.parse(fs.readFileSync("./data.json", 'utf8'));
但是,在脚本执行过程中的某个时刻,我尝试访问,例如
data['someProp']['prop1']
它会引发一个类型错误:
TypeError:无法读取未定义的属性“prop1”
这真的很奇怪,因为数据
,数据['someProp']
,数据['someProp']['prop1']
都是定义的
如果我这样做
console.log(data['someProp']['prop1']);
它在屏幕上正确显示数据['someProp']['prop1']
的值,并立即引发类型错误
是什么导致了这种奇怪的行为?有没有关于解决这样一个问题的猜测或提示
更新: 让我说清楚一点。我觉得很奇怪,因为如果我
console.log(data['someProp']['prop1']);
在引发错误的行上方,它正确地打印出值并立即引发错误
假设数据['someProp']['prop1']=“someProp值”
这是错误日志
someProp value
console.log(data['someProp']['prop1']);
^
TypeError: Cannot read property 'prop1' of undefined
所以如果我这样做了
console.log(data['someProp'])
这是我得到的日志:
{
...
"someProp": {
"prop1": "someProp value"
},
...
}
undefined
这是我困惑的部分。当I console.log时,它会打印出数据['someProp']
的内容,紧接着是未定义的内容。这是什么原因造成的
另一件奇怪的事是
console.log(typeof data['someProp']);
结果是:
object
undefined
数据['someProp']
如何成为对象以及未定义的对象?好的,我来回答我自己的问题并结束这个问题
正如用户1689607猜测的那样,我的异步代码有一个bug。例如,我的代码如下所示:
function test(done) {
...
if (err) {
done();
}
...
if (data['someProp']['prop1']) {
...
done();
}
}
由于第一个done()是在不返回的情况下调用的,因此我认为它会在回调执行结束时返回,并遍历代码的其余部分,这是不应该的。在此期间,数据发生了一些更改,这就是导致错误的原因
所以返回done()代码>修复了该问题
谢谢@user1689607.“……在脚本执行过程中的某个时刻……”这似乎是关键,不是吗。如果它告诉你它是未定义的
,那就意味着它是未定义的
。要么在定义代码之前运行代码,要么错误地访问属性。无论哪种方式,都无法从您提供的内容中了解问题。请看这个问题,它有一个函数可以调用n个级别的属性,如果为null,则返回空字符串。您可以逐字发布一些代码吗?console.log
的返回值是undefined
。这不是记录的内容的一部分。如果执行console.log(“foo”)
,您将得到未定义的“foo”
。关于您的问题,我们需要一个工作示例来了解发生了什么。看起来里面可能有一些异步代码play@user1689607嘿,正如您所猜测的,代码涉及一些异步代码。当我刚刚调试时,我意识到当我调用done()callback时,我没有返回。我修复了那些异步问题,现在问题已经解决了。谢谢