2014-01-08 7 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 и отображаемый в измененной форме.

Однако, когда я извлекаю эти данные из базы данных MongoDB с помощью Mongoose и запускаю ее через те же функции, когда данные отправляются на сервер, они отправляются в немодулированной форме по причинам, которые я не могу понять. Незнакомец по-прежнему (по крайней мере для меня), манипулируемая форма отображается при доступе непосредственно через 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

Если вы хотите получить доступ и манипулировать Mongoose документы как объекты обычный JavaScript вместо экземпляров модели, вы можете включить lean() в цепочке запросов:

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

Премного. Я подозреваю, что мой вопрос является дубликатом вопроса, выделенного выше, но тем не менее вы предоставили четкое решение. Я подозреваю, что мои знания об Мангусте могут сделать с некоторой работой! Благодаря! – Michael

Смежные вопросы