2015-04-10 3 views
0

У меня возникла ситуация, когда мне нужно запустить запрос mongodb из кода nodejs (expressjs) и передать результат запроса в ответ на запрос моего веб-api, но перед моим запрос выполняет следующие строки кода, который выполняется, и пустой ответ отправляется обратно. Код, который я написал, как следует,Последовательное выполнение кода nodejs с запросом mongodb

router.get('/recent', function (req, res){ 
    var result = []; 
    router.db.collection('Posts').find({},{ _id : 1, uid : 1, imagePath : 1, cntLikes : 1, uploadDate : 1}).limit(5).sort({ uploadDate : -1 }).toArray(function(err, docs) { 
       docs.forEach(function (doc){ 
         router.db.collection('Users').findOne({ "_id" : mongodb.ObjectId(doc.uid)}, function (err, user){ 
          doc.username = user; 
          result.push(doc); 
          }); 
       }); 


    res.send(result);  // this line send empty result to caller 
    }); 
}); 

Я попытался методы обратного вызова, async.waterfall и программно остановить выполнение, но все потерпели неудачу. Я также пробовал обещания, но я не думаю, что обещания могут помочь мне в этом сценарии.

ответ

1

Вы используете другой асинхронный вызов в своем цикле, который выполняется после res.send(result). Я думаю, что вы после async.map, поэтому, возможно, что-то вдоль линий этого в пределах вашего сообщения обратного вызова

function addUserToPost(item, callback) { 
    router.db.collection('Users').findOne({ "_id" : mongodb.ObjectId(doc.uid)}, function (err, user){ 
     doc.username = user; 
     callback(err, doc); 
    }); 
} 

async.map(docs, addUserToPost, function(err, posts) { 
    res.send(posts); 
}); 

Вы хотите карту от вас «Сообщения» на столбах с пользовательской информацией добавлен.

+0

Хотя @ subburaj Ответит чище IMO –

1

Try для этого:

router.get('/recent', function (req, res){ 
    var result = []; 
    router.db.collection('Posts').find({},{ _id : 1, uid : 1, imagePath : 1, cntLikes : 1, uploadDate : 1}).limit(5).sort({ uploadDate : -1 }).toArray(function(err, docs) { 
    var counter = 0; 
       docs.forEach(function (doc, index){ 
         counter++; 
         router.db.collection('Users').findOne({ "_id" : mongodb.ObjectId(doc.uid)}, function (err, user){ 
          doc.username = user; 
          result.push(doc); 
          if(counter === index){ 
          res.send(result);  
          } 
          }); 
       });   
    }); 
}); 
+0

Спасибо за вашим решение @Subburaj он работал, но я обнаружил, что если запрос для получения последней записи выполняется перед любым другим запросом или любой другой запрос требуется больше времени для завершения, чем последний запрос, тогда результат не содержит эту запись (более долгая запись запроса), поэтому мне нужно пропустить эту запись, чтобы вы могли рассказать мне, как решить эту ситуацию. –

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