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