2014-01-08 44 views
0

我正在学习Node.js/Express,并且遇到了相当奇怪的问题。我觉得它的内心可能存在对复制数组/对象有缺陷的理解,所以我会很感激任何评论,因为虽然我已经读到了我很难过的事情。虚拟数据操作与db数据操作不一致

我已经写了两个函数,它们基本上都需要一个数组,操作它并返回已更改的数组,以便进一步处理/将其转发给客户端。该代码是在https://gist.github.com/grabbeh/8314291但总的意图可以表述如下:

按预期工作与现有的客户端

exports.test = function(req, res){ 
    returnDummyData(function(data){ 
     transformData(data, function(data){ 
      res.json(data); 
     }); 
    }); 
}  

原始数据不上的客户端显示更新的数据变换状态

exports.test = function(req, res){ 
    returnDBData(function(data){ 
     transformData(data, function(data){ 
      res.json(data); 
     }); 
    }); 
}  

我调查问题和使用虚设数据,以检查作为js文件中定义的函数。当使用这些数据时,它被各种函数操纵(首先为每个对象添加一个排名属性,然后添加一个countryRanking属性),然后用res.json发送给客户端并以改变的形式显示。

但是,当我使用Mongoose从MongoDB数据库中提取这些数据并通过相同的函数运行它时,当数据发送到服务器时,它以非操作形式发送,原因我无法理解。陌生人仍然(至少对我来说),当通过console.log直接访问时显示被操作的表单,但是当通过console.log显示整个对象时,会显示未修改的对象,如下例所示:

功能有问题

Photo.find({ country:'RUS', tag: 'cat', isVoted: true}, function(err, data){ 
    calculatePhotoRanking(data, function(data){ 
     calculateCountryRankings(data, function(data){ 
      // displayed object does not show ranking or countryRanking properties 
      console.log(data[0]) 
      // however this does display the calculated countryRanking 
      console.log(data[0].countryRanking) 
      res.json(data) 
     });  
    }); 
}) 

我困惑的是这到底是怎么来是坦然。我认为这可能是因为在调用时通过函数时不改变'数据'的命名,而是改为'数据','dataTwo','dataThree'没有任何区别。

回答

1

如果你想为纯JavaScript对象模型实例,而不是访问和操作猫鼬的文件,你可以在你的查询链包括lean()

Photo.find({country:'RUS', tag: 'cat', isVoted: true}).lean().exec(
    function(err, data) { 
     calculatePhotoRanking(data, function(data) { 
      ... 
+0

非常感激。我怀疑我的问题是上述突出问题的重复,但您提供了一个明确的解决方案。我怀疑我的猫鼬知识可以做一些工作!谢谢! – Michael