无法从Mongoose语句中推入数组

背景Market集合具有一个url属性,用于存储来自“ Site集合中选定sites的一系列url。 我创build了一个可以从/routes/markets.js调用的助手(代码如下),基本上根据req.params.urlselectMarket ,然后遍历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}); }); };