无法使用async,nodejs和mongodb更改javascript对象属性

我有以下代码:

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); } 

我想更新“testing”对象的post.comments属性(请参阅**部分),但我无法这样做。 但是,当我将“testing”对象克隆为“obj”,然后设置“obj.post.comments”它的工作。 为什么是这样? 是因为我搞砸了一些范围问题?

谢谢。

我自己解决了这个问题。 事实certificate,我已经存储了mongodb的Schema.Types.ObjectId在test.post.comments之后,我发现一些混乱,不能被覆盖。 当我将testing对象的克隆创build为“obj”时,obj.post.comments中的Schema.Types.ObjectId对象存储在允许修改的不同位置。 我的猜测是test.post.comments指向mongodb本身内的Schema.Types.ObjectId,因此不能被覆盖。 当我创build一个testing对象的副本时,问题就解决了。

 var test = this.act.concat(); 

用这个来代替。 因为js中的数组replace实际上并不复制数组,而是引用原始地址。

例如

 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'