2014-01-05 15 views
2

我有以下代碼:無法更改與異步,JavaScript的的NodeJS對象屬性和MongoDB

exports.home = function(Comment,User,Activity){ 
    return function(req, res){ 
     var get_url = req.url.split(/\?/)[1]; 
     if (!req.user) 
     { 
      res.writeHead(302, { 
       'Location': '/' 
      }); 
      res.end(); 
      return; 
     } 

     var posts_id_array = req.user.posts_id_array; 
     var stocks_array = req.user.watch_list; 
     var subscribe_to_arr = req.user.subscribe_to; 
     User.find({_id:{$ne:req.user._id, $nin:subscribe_to_arr}}).sort('-_id').limit(10).exec(function(err_user, users){ 
      Activity.find({$or:[{owner_id : {$in :subscribe_to_arr}},{owner_id:req.user._id}]}).sort('-time_stamp').limit(20).exec(function(err_post,activities){ 
       if(err_post || !activities) { 
        res.render('home',{user:req.user,stocks:JSON.stringify(stocks_array)}); 
       } 
       else 
       { 
        var funcArr = []; 
        var hasPost = ["publish","comment","like"]; 
        var notPost = ["add_stock","delete_stock"]; 
        for(var i =0;i<activities.length;i++) 
        { 
         if(hasPost.indexOf(activities[i].type)!=-1){ 
          var fobj = { 
           act: activities[i], 
           f:function(callback){ 
            var test = this.act; 
            var comments = test.post.comments; 
            Comment.find({_id:{$in:comments}},function(err,_comments){ 
             console.log("test.post.comments"); 
             //console.log(test.post.comments); 
             console.log("comments "); 
             console.log(_comments); 
             console.log("type"); 
             console.log(typeof test); 
             console.log("cloning obj"); 
            // obj = JSON.parse(JSON.stringify(test)); // cloning obj 
             console.log(test); 
             console.log("setting value of comments"); 
             **console.log(test.post.comments = _comments);** //unable to change test.post.comments 
             console.log("after assignment"); 
             console.log(test.post.comments); // remain unchanged but work with obj.post.comments if I clone test as obj and use obj instead. 
             callback(null,test); 
            }); 
           } 
          } 
          funcArr.push(fobj.f.bind(fobj)); 
         }else{ 
          var fobj = { 
           act: activities[i], 
           f :function(callback){ 
            callback(null,this.act); 
           } 
          } 
          funcArr.push(fobj.f.bind(fobj)); 
         } 
        } 

        async.series(funcArr,function(err,resArr){ 
         console.log("resArr"); 
         console.log(resArr); 
         res.render('home',{user:req.user,posts:JSON.stringify(resArr),stocks:JSON.stringify(stocks_array), other_users:JSON.stringify(users)}); 
        }); 
       } 
      }); 
     }) // end of User.find 
    }// end of return function(req,res); 
} 

我想更新「測試」對象的post.comments財產(見**部分),但我無法這樣做。但是,當我將「測試」對象克隆爲「obj」時,則將其設置爲「obj.post.comments」。爲什麼會這樣?是因爲我搞砸了一些範圍問題?

謝謝。

+0

我會盡力幫忙,但橫向滾動是PITA。跳躍。 – elclanrs

回答

1

我自己解決了這個問題。事實證明,我已經在test.post.comments中存儲了mongodb的Schema.Types.ObjectId,在我發現的一些亂七八糟的東西后我不能被覆蓋。當我將測試對象的克隆創建爲「obj」時,obj.post.comments中的Schema.Types.ObjectId對象存儲在允許修改的其他位置。我的猜想是test.post.comments指向mongodb本身內的Schema.Types.ObjectId,因此不能被覆蓋。當我創建測試對象的副本時,問題就解決了。

0

取而代之。 ,因爲js中的數組替換實際上不會複製數組,而是引用原始地址。

例如

var test = ['A','B','C','D']; 
var copied = test; 
test[0] = 0; 
copied[1] = 0; 

console.log(test) //0,0,'C','D' 
console.log(copied) //0,0,'C','D' 

所以爲了避免這個問題,你可以使用.concat()來複制數組 如果不添加任何東西,它會被用作複製。

var test = ['A','B','C','D']; 
var copied = test.concat(); 
test[0] = 0; 
copied[1] = 0; 

console.log(test) //0,'B','C','D' 
console.log(copied) //'A',0,'C','D' 
+0

不幸的是,這並不適用於我的情況。 –