2012-12-04 70 views
3

我在NodeJS上遇到了一個非常奇怪的JavaScript錯誤。「無法讀取'​​'未定義的屬性,即使它已被定義

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

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

然而,在腳本執行過程中的某個時刻,我嘗試訪問,例如,

data['someProp']['prop1'] 

和它提出了一個錯誤類型:

TypeError: Cannot read property 'prop1' of undefined

這真的很奇怪,因爲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

+2

*「...在腳本執行過程中的某個時候......」*那好像是關鍵,不是。如果它告訴你它是'未定義的',那麼這意味着它是'未定義的'。無論是在定義代碼之前運行代碼,還是錯誤地訪問屬性。無論哪種方式,無法從您提供的內容中知道問題。 –

+0

看看這個問題,它有一個函數調用n個級別的屬性,如果它爲空則返回空字符串。 http://stackoverflow.com/questions/13345449/calling-object-properties-in-n-levels-javascript –

+0

@ user1689607你能看看我更新的問題嗎?我很困惑,因爲console.log正確顯示值,並立即抱怨它未定義。我想知道這是否是由data.json文件中的一些損壞的文本編碼引起的。但這只是我的猜測。 –

回答

1

好的,我會回答我自己的問題,並關閉這個問題。

正如user1689607猜測,我的異步代碼有一個錯誤。例如,我的代碼看起來像:

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

因爲第一完成()被調用沒有回報,我認爲它在回調執行結束回來,並通過代碼的其餘部分,它不該去「T。在此期間,數據發生了一些變化,這就是導致錯誤的原因。

因此return done();修復了這個問題。

謝謝@ user1689607。

相關問題