Javascript 无法从Mongoose then语句推入数组

Javascript 无法从Mongoose then语句推入数组,javascript,node.js,mongodb,mongoose,mongodb-query,Javascript,Node.js,Mongodb,Mongoose,Mongodb Query,背景:一个市场集合具有一个url属性,该属性存储来自站点集合中选定的站点的url数组。我创建了一个助手(下面的代码),我可以从/routes/markets.js调用它,它基本上根据req.params.url选择Market,然后在Market.sites数组上循环,找到相应的Site,将它们存储到一个数组中,以便在呈现视图时使用 问题:在阵列上调用推送函数实际上并不会推送任何东西,在最后一个控制台中。log语句中,我只是记录了日志[] 问题:我如何才能推进此阵列?这是of循环和then承诺调

背景:一个
市场
集合具有一个
url
属性,该属性存储来自
站点
集合中选定的
站点
的url数组。我创建了一个助手(下面的代码),我可以从
/routes/markets.js
调用它,它基本上根据
req.params.url
选择
Market
,然后在
Market.sites
数组上循环,找到相应的
Site
,将它们存储到一个数组中,以便在呈现视图时使用

问题:在阵列上调用
推送
函数实际上并不会推送任何东西,在最后一个
控制台中。log
语句中,我只是记录了日志
[]

问题:我如何才能推进此阵列?这是of循环和then
承诺
调用的
问题吗

market helpers.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});
    });
};
router.get('/:url', (req, res) => {
  Markets.listSites(req, res, 'login-markets', 'markets/index');
});
routes/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});
    });
};
router.get('/:url', (req, res) => {
  Markets.listSites(req, res, 'login-markets', 'markets/index');
});
Site.find({url})
是一个异步操作,因此在等待异步操作的结果之前执行
res.send
。您可以使用
Promise等待所有异步操作的结果。所有
都解决后,您可以返回如下响应:

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});
    });
};