我在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
?
答案 0 :(得分:1)
好的,我会回答我自己的问题,然后关闭这个问题。
正如user1689607猜测的那样,我的异步代码存在错误。例如,我的代码看起来像:
function test(done) {
...
if (err) {
done();
}
...
if (data['someProp']['prop1']) {
...
done();
}
}
由于第一个done()被调用而没有返回,我认为它在回调执行结束时返回并通过其余的代码,它不应该。在此期间,数据发生了一些变化,这就是造成错误的原因。
所以return done();
解决了问题。
谢谢@ user1689607。