2013-10-02 42 views
0

我遇到了問題,但我不太清楚爲什麼我無法解決我的問題。在向用戶呈現數據之前刪除JSON內容/刪除JavaScript對象屬性

我有一個使用AngularJS,Node.JS和MongoDB(Mongoose)構建的SPA。現在在客戶端我有一個表單來註冊一個新用戶。該表單具有文本輸入,其功能與其onblur事件(或準確地說ng-blur)相關聯。該函數發送一個Ajax/$http呼叫到後端,在提交表單之前檢查用戶名是否唯一。一切運作良好,這裏是我的代碼迄今(請注意,我稍微修改了代碼,這個問題)...

這裏的文本框,

<input type="text" name="displayName" id="displayName" ng-model="user.displayName" ng-blur="checkUserName(user)" /> 

這裏是我的控制器中的模糊函數

this.userNameCheck = function(user){ 
     return $http({method: 'GET', url: '/api/users/displayName/' + user.displayName}) 
      .then(function(response) { 
       if(response.data.length > 0){ 
        user.userWarning = userWarning; // userWarning is a string/ var that is passed to the form 
       } 

      }, function(response) { 
       console.log(response); 
      }); 
    }; 

這裏是包含在不同項目中我的節點/貓鼬代碼:

exports.displayName = function (req, res, next, displayName) { 

    User.find({displayName : displayName}).limit(1).exec(function (err, results) { 
     if (err) return next(err); 
     if (!results) return next(new Error('No user found')); 
     res.jsonp(results || null); 
    }); 

}; 

所有這些很棒,但是當我檢查控制檯時,我可以看到,當我們有一個匹配時,返回的結果對象包含像哈希密碼,鹽等等的一切...我想要阻止這些返回在我的目的。所以,我這樣修改了我的後端代碼:螢火蟲是什麼一個成功的調用(一個發現匹配)返回的對象仍然包含已刪除屬性返回檢查時

exports.displayName = function (req, res, next, displayName) { 

    User.find({displayName : displayName}).limit(1).exec(function (err, results) { 
     if (err) return next(err); 
     if (!results) return next(new Error('No user found')); 

     // new code 
     if(results.length !== 0){ 
      var returnObj = results[0]; 
      delete returnObj.hashed_password; 
      delete returnObj.salt; 
      delete returnObj._id; 
      res.jsonp([returnObj] || null) 
     }else{ 
      res.jsonp(results || null); 
     } 
    }); 

}; 

現在...我要去哪裏錯了?

+0

無法解決實際問題,但請注意,res.jsonp([returnObj] || null)的'null'部分將永遠不會被使用。該行等同於'res.jsonp([returnObj])'。數組從不虛僞。 –

回答

0

我的猜測是返回對象具有原型鏈的更多屬性,所以它們實際上並沒有被刪除。

如果刪除操作符成功,它將完全從對象中刪除屬性。但是,如果在對象的原型鏈上存在具有相同名稱的屬性,則該對象將從原型繼承該屬性。

〜MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

你可以檢查此與hasOwnProperty測試這種理論,但它可能是更安全的只是建立一個你想要的值的飛物體上,或限制從Mongo返回的值?

換句話說,用JavaScript上的即時(類似):

var returnObj = results[0], 
safeUserObj = { 
    userName : returnObj["username"], 
    email : returnObj["email"] 
}; 

res.jsonp([safeUserObj]); 

或者你可以只返回你蒙戈所需的字段,使用聚合框架的$match$project。 (下面的控制檯風格的代碼,不知道你會如何需要適應這個貓鼬爲)

db.users.aggregate([ 
{ $match : { displayName : displayName } }, 
{ $project : { 
    displayName : 1, 
    email : 1 
    } 
} 
]); 

編輯:一提的是,你可以使用的項目參數,找到做同樣的,因爲我在底部的解決方案做了而不使用聚合框架。

+0

我決定在飛行中創建一個新的對象,以確保我能夠與時間同步! –

3

你試圖從Mongoose對象中刪除,而不是實際的存儲。最簡單的變化將是:

var returnObj = results[0].toJSON(); 
delete returnObj.hashed_password; 
delete returnObj.salt; 
delete returnObj._id; 

你也只是selectdocumentation)要包含的字段/排除。

+0

+1。對於'delete returnObj._doc.hashed_pa​​ssword;'的直接調用也應該在這種特殊情況下與貓鼬對象一起工作。測試。 –