无法从Mongoose语句中推入数组
背景 : Market
集合具有一个url
属性,用于存储来自“ Site
集合中选定sites
的一系列url。 我创build了一个可以从/routes/markets.js
调用的助手(代码如下),基本上根据req.params.url
selectMarket
,然后遍历market.sites
数组并find相应的Site
,将它们存储到在渲染视图时可以使用的数组。
问题 :调用数组上的push
函数实际上并没有推送任何东西,而在最后一个console.log
语句中,我仅仅logging了[]
问 :我怎样才能推入这个数组? 这是for of
循环, then
Promise
调用的问题?
市场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}); }); };
路线/ markets.js
router.get('/:url', (req, res) => { Markets.listSites(req, res, 'login-markets', 'markets/index'); });
Site.find({url})
是一个asynchronous操作,因此res.send
在等待asynchronous操作的结果之前被执行。 您可以使用Promise.all
等待所有asynchronous操作的结果,一旦所有这些操作都解决了,您可以返回如下响应:
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}); }); };