【问题标题】:"Cannot read property of '<propName>' of undefined" even though it's defined“无法读取未定义的 '<propName>' 的属性”,即使它已定义
【发布时间】:2012-11-22 09:33:50
【问题描述】:

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

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

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

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

data['someProp']['prop1']

它会引发类型错误:

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

真的很奇怪,因为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 一样成为对象?

【问题讨论】:

  • "...在脚本执行过程中的某个时刻..." 这似乎是关键,不是吗。如果它告诉您它是undefined,那么这意味着它是undefined。要么在定义之前运行代码,要么错误地访问属性。无论哪种方式,都无法从您提供的内容中得知问题。
  • 看看这个问题,它有一个函数可以调用n层的属性,如果为null则返回空字符串。 stackoverflow.com/questions/13345449/…
  • 你能逐字发布一些代码吗?
  • console.log的返回值为undefined。这不是正在记录的内容的一部分。如果你做console.log("foo"),你会得到"foo" undefined。关于您的问题,我们需要一个工作示例来了解发生了什么。似乎可能有一些异步代码在播放
  • @user1689607 嘿,正如您所猜到的,代码涉及一些异步代码。而我刚才在调试的时候,发现当我调用done()回调的时候,并没有返回。我修复了这些异步问题,现在问题已解决。谢谢!

标签: javascript node.js undefined-behavior


【解决方案1】:

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

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

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

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

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

感谢@user1689607。

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 2020-05-31
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多