async waterfall返回节点js和mongodb中数组的单个记录

时间:2016-01-27 18:40:10

标签: javascript angularjs node.js mongodb asynchronous

我在nodejs和mongodb和angularjs中创建chield和parent类别菜单。我担心的是当我使用回调返回推送的数组时,数组只包含单个记录,虽然我有很多数据。我不知道什么是gonig错误。这是我的代码。

async.waterfall([
  function(cb) {
    //getting the parent category
    mealCatModel.find({
      parentId: ''
    }, {}, function(error, result) {
      if (error) {
        cb(error, null);
      } else {
        if (result) {
          //loop through the record
          result.forEach(function(key, value) {
            //find the chield category on behalf of parent id and key.id
            mealCatModel.find({
              parentId: key._id
            }, {}, function(err, subCat) {
              if (subCat) {
                subCat.forEach(function(k, v) {
                  if (k.parentId == key._id) {
                    // pushing all the record in a single array
                    mainJson.push({
                      mainCatId: key._id,
                      mainCatName: key.mealCatName,
                      subCatId: k._id,
                      subCatName: k.mealCatName
                    });
                    cb(null, mainJson);

                  }
                })
              }
            })
          })
        } else {
          cb('record not foound', null);
        }
      }

    });
  }
], function(error, mainJson) {
  ///return the err
  if (error) {
    res.json({
      type: false,
      data: 0
    });
  } else {
    // return the array to front end
    res.json({
      type: true,
      data: mainJson
    });
  }
});

第一个查找函数获取主要类别并依赖于我在键值对中循环的那条记录,然后我发现key._id代表我再次运行具有主类别的父元组的查询查询。所以以这种方式我得到我的chield类别,然后推送mainJson数组中的数据。但是当我返回cb()回调时,它只返回单个数组。

1 个答案:

答案 0 :(得分:0)

回调正在.forEach中执行。在执行时,循环尚未完成所有迭代。您应该重构代码以在.forEach表达式后返回回调:

if (subCat) {
  subCat.forEach(function(k, v) {
    if (k.parentId == key._id) {
      // pushing all the record in a single array
      mainJson.push({
        mainCatId: key._id,
        mainCatName: key.mealCatName,
        subCatId: k._id,
        subCatName: k.mealCatName
      });
    }
  });
  return cb(null, mainJson);
}