我正在学习Node.js / Express,并且遇到了一个非常奇怪的问题。我觉得可能对复制数组/对象有一个错误的理解,所以我会感激任何评论,因为虽然我已经读过这个问题但我很难过。
我编写了两个函数,它们基本上采用数组,操作它并返回更改后的数组以便进一步处理/转发到客户端。代码位于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数据库中提取这些数据并通过相同的函数运行它时,当数据被发送到服务器时,它会以未经处理的形式发送,原因我无法理解。 Stranger仍然(至少对我来说),直接通过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)
});
});
})
我很困惑,坦率地说这是怎么回事。我认为这可能是因为在调用时通过函数时没有改变'data'的命名,但是改为'data','dataTwo','dataThree'没有区别。
答案 0 :(得分:1)
如果要将Mongoose文档作为纯JavaScript对象而不是模型实例进行访问和操作,可以在查询链中包含lean()
:
Photo.find({country:'RUS', tag: 'cat', isVoted: true}).lean().exec(
function(err, data) {
calculatePhotoRanking(data, function(data) {
...