2012-03-08 57 views
5

我得到的結果(對象)從貓鼬查詢回來,要替換/刪除一些按鍵,之前我字符串化的對象,並將其發送給客戶端。如何檢查/迭代節點中的對象?

當我CONSOLE.LOG對象,一切都很好(所有鍵都列出來,僅此而已)。當我在對象上做一個for..in時,隱藏的字段會出現在任何地方(以及感興趣的鍵,請不要)。他們有道理 - 他們屬於貓鼬 - 但我不想要他們。在對象 - 隱藏字段彈出窗口中使用Object.keys或Object.getOwnPropertyNames時,同樣的事情發生,沒有用處。

所以我想與util.inspect檢查元素(OBJ,真實,空,真)並記錄結果到控制檯。控制檯上的結果是一樣的,就好像我將console.log直接對象沒有檢查。

現在,兩個問題;

  1. 如何正確檢查一個對象,以便實際獲取有關該對象的內部/隱藏信息?
  2. 我如何可以遍歷對象,只能獲得場? (是的,我做的for..in循環中的hasOwnProperty檢查)

//編輯

OK,我知道了。經過一番調查後,我意識到,貓鼬對象代理的性質,以及具有一個功能的toJSON,這解釋了爲什麼console.logs是在預期的輸出結構。解決方案是使用Mongoose自己的toObject方法;

mongooseObj.toObject({ getters: true, virtuals: false }) 

這樣一來,我可以遍歷Object.getOwnPropertyNames和替換/刪除鍵我不想讓客戶知道!

+0

你能改寫一下你的問題嗎?我很難理解你在問什麼。 '隱藏領域'是什麼意思?原型鏈上的屬性是否更高?標記爲不可枚舉的屬性?或以_underscore開頭的屬性? – 2012-03-09 00:03:16

回答

4

我要猜你正在尋找一個貓鼬查詢返回的文檔對象當你真的只是想看到的數據。如果我的猜測是正確的,你可能會想是這樣的:

Model.findOne({ name: 'john' }, function (err, doc) { 
    var data = doc.toObject(); 

    // do whatever you need to with data 
    delete data.age; 
    delete data.weight; 
    data.isAwesome = true; 

    // now stringify the data and do something with it 
    callback(JSON.stringify(data)); 
}); 
+1

嗨abe,謝謝你的回答。我實際上剛剛看到,你的答案中有toObject ..應該從一開始就看到了;)感謝您的幫助! – japrescott 2012-03-10 11:44:14

0

此外,如果你想從文檔訪問某一領域你可以看看:

Document#get

// path 
doc.get('age') // 47 

// dynamic casting to a string 
doc.get('age', String) // "47"