无法从Mongoose然后声明推入数组

时间:2017-02-26 20:59:26

标签: javascript node.js mongodb mongoose mongodb-query

背景Market集合具有url属性,该属性存储来自sites集合中所选Site的网址数组。我创建了一个帮助器(下面的代码),我可以从/routes/markets.js调用它基本上根据Market选择req.params.url然后遍历market.sites数组并找到相应的{ {1}},将它们存储到我可以在渲染视图时使用的数组中。

问题:调用数组上的Site函数并没有实际推送任何内容,而在上一个push语句中我只记录console.log

问题:如何推入此阵列?这是[]循环和for of then调用的问题吗?

市场helpers.js

Promise

路由/ markets.js

exports.listSites = (req, res, errorRender, successRender) => {
  let sites = [];
  Market.find({url: req.params.url})
    .then((market) => {
      for (url of market[0].sites)
        Site.find({url}).then((site) => {
          sites.push(site[0]);
        }).catch((err) => console.log(err));

      console.log(sites);
      res.render(successRender, {sites});
    })
    .catch((errors) => {
      res.render(errorRender, {errors});
    });
};

1 个答案:

答案 0 :(得分:1)

Site.find({url})是异步操作,因此在等待异步操作的结果之前执行res.send。您可以使用Promise.all等待所有异步操作的结果,一旦所有异步操作都得到解决,您可以按如下方式返回响应:

exports.listSites = (req, res, errorRender, successRender) => {
  let sites = [];
  Market.find({url: req.params.url})
    .then((market) => {
      const promises = [];
      for (url of market[0].sites)
            promises.push(Site.find({url}).then((site) => sites.push(site[0])));

      return Promise.all(promises).then(() => {
          console.log(sites);
          res.render(successRender, {sites});
      });
    })
    .catch((errors) => {
      res.render(errorRender, {errors});
    });
};