Javascript &引用;无法读取'&书信电报;propName>';“未定义”的定义;即使它';定义

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']

我在NodeJS上遇到了一个非常奇怪的Javascript错误

我有一个巨大的data.json文件(24MB)。我是通过互联网读的

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时,我没有返回。我修复了那些异步问题,现在问题已经解决了。谢谢