3

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

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

var data = JSON.parse(fs.readFileSync("./data.json", 'utf8'));

但是,在脚本执行期间的某个时刻,我尝试访问,例如,

data['someProp']['prop1']

它会引发类型错误:

TypeError:无法读取未定义的属性“prop1”

这真的很奇怪,因为data, data['someProp'],data['someProp']['prop1']都被定义了。

如果我做

console.log(data['someProp']['prop1']);

data['someProp']['prop1']它在屏幕上正确显示值并立即引发类型错误。

什么可能导致这种奇怪的行为?任何猜测或提示来解决这样的问题?


更新:

让我更清楚一点。我觉得很奇怪,因为如果我把

console.log(data['someProp']['prop1']);

在它引发错误的正上方的行中,它正确打印出值并立即引发错误。

比方说data['someProp']['prop1'] = "someProp value"

然后这是错误日志。

someProp value

console.log(data['someProp']['prop1']);
                        ^

TypeError: Cannot read property 'prop1' of undefined

所以如果我这样做

console.log(data['someProp'])

然后这是我得到的日志:

{
  ...
  "someProp": {
    "prop1": "someProp value"
  },
  ...
}
undefined

这是我感到困惑的部分。当我 console.log 它时,它会data['someProp']立即打印出undefined. 什么会导致这种情况?

另一个奇怪的事情是

console.log(typeof data['someProp']);

结果是:

object
undefined

怎么可能data['someProp']是对象undefined呢?

4

1 回答 1

1

好的,我会回答我自己的问题并结束这个问题。

正如 user1689607 猜测的那样,我的异步代码存在错误。例如,我的代码如下所示:

function test(done) {
  ...
  if (err) {
    done();
  }
  ...
  if (data['someProp']['prop1']) {
    ...
    done();
  }
}

由于第一个 done() 是在没有返回的情况下调用的,我认为它会在回调执行结束时返回并遍历其余代码,这是不应该的。在此期间,数据发生了一些变化,这就是导致错误的原因。

所以return done();解决了这个问题。

谢谢@user1689607。

于 2012-12-06T16:32:24.457 回答