“即使已经定义了</propname>,也无法读取未定义的'<propname>'的属性

时间:2012-12-04 17:14:22

标签: javascript node.js undefined-behavior

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

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

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

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

data['someProp']['prop1']

并引发类型错误:

  

TypeError:无法读取属性&#39; prop1&#39;未定义的

这很奇怪,因为datadata['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

1 个答案:

答案 0 :(得分:1)

好的,我会回答我自己的问题,然后关闭这个问题。

正如user1689607猜测的那样,我的异步代码存在错误。例如,我的代码看起来像:

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

由于第一个done()被调用而没有返回,我认为它在回调执行结束时返回并通过其余的代码,它不应该。在此期间,数据发生了一些变化,这就是造成错误的原因。

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

谢谢@ user1689607。