2013-11-25 2 views
1

теперь я работаю над своим приложением nodejs. Но у меня есть некоторые проблемы.Узел js промежуточное ПО для запроса async для mongo

Так что все, что мне нужно, добавить в поле аватара для публикации объектов.

Это выглядит примерно так.

В mongodb есть 2 пользователя и должность модели. Post имеет поле userId для отношений «один ко многим». И у пользователя есть аватар, я хранил строку для тега изображения на экране.

Но я хочу показать все сообщение с пользовательским аватаре, так что это мой дом метод от контроллеров/articles.js

exports.home = function() { 
     Article.list(function (err,articles) { 
      _.each(articles, function (item){ 
       User.find({is:item.id}, function(err, user) 
       { 
        item.avatar = user.avatar 
       }) 
     }) 
    }) 
} 

Но это не работает. Я понимаю, что это асинхронная проблема. Но я не знаю, как это исправить. Я не хочу менять свою структуру mongodb. И я не хочу получать почту и всех пользователей во время каждого запроса. Так что, возможно, ты поможешь мне с этим. Это мачта будет с промежуточным программным обеспечением - но я пробовал, и это не помогает.

ответ

2

underscore.each() не подходит для этого. Вам нужно использовать что-то вроде async.each(), чтобы убедиться, что вы получите все аватары, прежде чем возвращать результат в ответ. Некоторая вещь вроде этого (возможно, вам потребуется обработать некоторые ошибки):

var async = require('async'); 
exports.home = function (res) { 
    Article.list(function (err,articles) { 
     async.each(articles, function (item, callback){ 
      User.find({is:item.id}, function(err, user) { 
       if (user) { 
        item.avatar = user.avatar; 
       } 
       callback(null); 
      }); 
     }, function(err) { 
      // after finding all avatars, return your articles (with avatars if available) 
      // back in the response 
      res.send(articles); 
     }); 
    }); 
}; 
Смежные вопросы