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 に答える