2014-09-05 9 views
0

在我的路由中,我試圖在將數據發送到我的視圖前從數據庫中取代任何值。在將路由發送到視圖(Node js)之前,無法從路由中更改MongoDB/MongooseJS的結果 - 已解決

在這種情況下,我試圖用用戶名替代用戶的引用。但我的console.log只是不斷的返回值。

app.get('/message/inbox', function(req, res) { 
    var _id = req.user._id; 
    var inbox = null; 
    var users = null; 
    async.parallel([ 
     function(callback){ 
      Inbox.find({to: _id}, callback); 
     }, 
     function(callback){ 
      User.find({}, callback); 
     } 
    ], 
    function(err, result){ 
     inbox = result[0]; 
     users = result[1]; 
     for(var i = 0; i < inbox.length; i++) { 
      for(var j = 0; j < users.length; j++) { 
       if(String(inbox[i].from) == String(users[j]._id)) { 
        inbox[i].from = users[j].local.username; 
        console.log(users[j].local.username); 
        console.log(inbox[i].from); 
        break; 
       } 
      } 
     } 
     console.log(inbox); 
    }); 
}); 

這是我的控制檯回報:

[email protected] 
540468daeb56d5081ade600d 
[ { _id: 54084cacf212815422aabe94, 
    from: 540468daeb56d5081ade600d, 
    to: 5406bf4c8a8acc88120922dc, 
    headline: 'Some Headline', 
text: 'Some text', 
__v: 0 } ] 

SOLUTION

找到了解決辦法。我只需要在.find之後添加一個.lean()。這告訴貓鼬來傳遞數據作爲一個JavaScript對象,而不是一個MongooseDocument - Scource

app.get('/message/inbox', function(req, res) { 
    var _id = req.user._id; 
    var inbox = null; 
    var users = null; 
    async.parallel([ 
     function(callback){ 
      Inbox.find({to: _id}, callback).lean(); 
     }, 
     function(callback){ 
      User.find({}, callback).lean(); 
     } 
    ], 
    function(err, result){ 
     inbox = result[0]; 
     users = result[1]; 
     for(var i = 0; i < inbox.length; i++) { 
      for(var j = 0; j < users.length; j++) { 
       if(String(inbox[i].from) == String(users[j]._id)) { 
        inbox[i].from = users[j].local.username; 
        console.log(users[j].local.username); 
        console.log(inbox[i].from); 
        break; 
       } 
      } 
     } 
     console.log(inbox); 
    }); 
}); 

回答

0

什麼會從查找請求返回的是一個「貓鼬文件」,這實際上是相當複雜的,包含了所有的規則和方法相關的模式。您不能在架構上設置的約束之外進行修改。

因此,儘管簡單的序列化形式,對象是相當複雜的。你想要的只是一個基本對象,所以你可以修改它,但是你想要的。所以,簡單地說,只是叫.toObject()獲得「原始」 JavaScript對象沒有糖的其餘部分:

inbox = result[0].toObject(); 
users = result[0].toObject(); 

的基本對象有沒有方法和規則。修改。

+0

我發現這個解決方案的其他地方,但它一直返回「沒有辦法」toObject'「 – 2014-09-05 08:32:47

+0

@JesperNielsen那麼爲什麼要改變你的標題爲(解決)?它可以工作,也可以不工作 – 2014-09-05 08:36:53

+0

@NielLunn - 看看我更新的帖子。我找到了自己的解決方案。 – 2014-09-05 10:23:14