在Node.js服务器响应中从MongoDB抓取和发送元素



在我的快速路线中,我试图返回我使用Mongoose从MongoDB抓取的元素列表。我基本上是通过项目数组迭代,并使MongoDB调用获得每个项目的参数对象。但是,我在确保在发送响应之前获得所有参数时遇到了麻烦。我试过使用promise,其他异步库函数等,但它们似乎都不起作用。

当前迭代的代码看起来像这样(我已经尝试了很多不同的东西):

exports.findAll = function(req, res){
  Flow.find({}, function(err, items) {
    console.log(items);
    var payload = {}
    var params = [];
    for (var i=0; i < items.length; i++) {
      var count2 = 0;
      async.whilst(
        function() {
          return ((items[i]) && (count2 < items[i].params.length));
        },
        function(callback) {
          Parameter.findById(items[i].params[count2], function(err, out) {
            params.push(out);
            count2++;
            callback();
          });
        },
        function(err) {
          console.log(params);
          var payload = {
            "flows": items,
            "params": params
          };
          res.send(payload);
          console.log('success: flows found');
        }
      );
    }

这段代码发送了一个参数没有完全填满的有效负载。

处理这个问题的好方法是什么?老实说,我只是希望这些数据库调用是同步的,但我只是不知道如何使这个工作。

这似乎不是必要的,因为您实际上可以使用 $in 运算符处理第一次查询的所有结果:

Flow.find({},function(err,items) {
    var ids = [];
    // blocking? yes, but should be minor - do better if there are problems
    for ( var i=0; i < items.length; i++ ) {
       for ( var n=0; n < items[i].params.length; n++ ) {
           ids.push( items[i].params[n] );
       }
    }
    Parameter.find({ "_id": { "$in": ids } },function(err,params) {
        res.send({ "flows": items, "params": params });
    });
});

所以应该没有理由在异步循环中执行多个查询,或者你的代码似乎缺少循环作为问题的直接原因。

最新更新