【问题标题】:Cannot push into an array from Mongoose then statement无法从 Mongoose then 语句推入数组
【发布时间】:2017-02-26 20:59:25
【问题描述】:

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

问题:在数组上调用push 函数实际上不会推送任何内容,在最后一个console.log 语句中我只是记录了[]

问题:我怎样才能推入这个数组?这是for of 循环和then Promise 调用的问题吗?

ma​​rket-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});
    });
};

routes/markets.js

router.get('/:url', (req, res) => {
  Markets.listSites(req, res, 'login-markets', 'markets/index');
});

【问题讨论】:

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


    【解决方案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});
        });
    };
    

    【讨论】:

      猜你喜欢
      • 2017-10-09
      • 1970-01-01
      • 2015-08-20
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      相关资源
      最近更新 更多