2012-07-27 90 views
1

這是非常奇怪的......我用一個ref填充()填充我的架構內的數組,但是然後屬性無法訪問。換句話說,模式是這樣的:無法從Mongoose訪問populate()的d對象的屬性?

new Model('User',{ 
    'name': String, 
    'installations': [ {type: String, ref: 'Installations'} ], 
    'count': Number, 
} 

當然,Insallations是另一種模式。

然後我找到&填充一組用戶的...

model.find({count: 0}).populate('installations').exec(function(e, d){ 
    for(var k in d) 
    { 
     var user = d[k]; 
     for(var i in user.installations) 
     { 
      console.log(user.installations[i]); 
     } 
    } 
}); 

到目前爲止好!我看到打印出來好看的數據,這樣的:

{ runs: 49, 
hardware: 'macbookpro10,1/x86_64', 
mode: 'debug', 
version: '0.1' } 

但是,如果我嘗試實際訪問任何這些屬性,它們都是不確定的!例如,如果我添加另一個控制檯日誌:

console.log(user.installations[i].mode); 

然後,我看到「未定義」打印此日誌。 如果我嘗試的對象進行操作,像這樣:

Object.keys(user.installations[i]).forEach(function(key) { }); 

然後我得到一個典型的「[類型錯誤:Object.keys呼籲非對象]」的錯誤,表示user.installations [i]是不是一個對象(即使它被輸出到控制檯,就好像它一樣)。所以,我甚至嘗試了一些醜陋的像...

var install = JSON.parse(JSON.stringify(user.installations[i])); 
console.log(install, install.mode); 

,並再次第一輸出(安裝)是包含屬性「模式」一個不錯的對象......但第2個輸出是不確定的。

什麼給?

回答

3

最後,我解決了這個...

我試着做一個的console.log(typeof運算user.installations [1]);並得到「字符串」作爲輸出。這似乎很奇怪,因爲打印對象直接創建控制檯輸出(上圖),看起來像一個普通的對象,而不是一個字符串。所以,我試着做一個JSON.parse();在對象上,但收到錯誤「SyntaxError:意外的令牌r」

最後,我意識到發生了什麼事情。我上面描述的「漂亮的控制檯輸出」是用\ n(換行符)格式化的字符串的結果。我沒有預料到,無論出於何種原因。 JSON.parse()錯誤是由於在嘗試解析沒有引號的對象鍵時node.js解析器存在已知的必要性;在這裏看到SO問題: Why does JSON.parse('{"key" : "value"}') do just fine but JSON.parse('{key : "value"}') doesn't?

請特別注意,在我的情況下,JSON解析器在字符'r'上失敗,這是我的JSON字符串(上面)中的第一個鍵「runs」的第一個字符。起初,我擔心我需要一個定製的JSON解析器,但這個問題打擊了我。

回首我的原始模式。我使用String類型來定義安裝引用,因爲數組字段將安裝的_id屬性存儲爲字符串。我假設.populate()字段將對象轉換爲輸出上的字符串。

最後,我仔細看了看Mongoose文檔,意識到我應該引用基於Schema.ObjectID的對象。這解釋了一切,但肯定會給我一些修復,以便在我的架構和代碼中執行...