我正在编写一个Node路由,该路由应该在对象具有属性之后将对象推到在forEach循环外部声明的数组上。当我在循环中使用console.log数组时,它似乎正在处理数据,但是当我将其返回给客户端时。它是空的。
var todaysTopItemsBySaleFrequency = [];
listOfItemIdsAndSaleFrequency.forEach((item) => {
Product.findById(item.itemId).then((foundItem) => {
var fullItemData = foundItem.toJSON();
fullItemData.occurrences = item.occurrences;
todaysTopItemsBySaleFrequency.push(fullItemData);
console.log(todaysTopItemsBySaleFrequency);
});
});
return res.status(200).json(todaysTopItemsBySaleFrequency);
console.log语句显示正确地填充了名为todaysTopItemsBySaleFrequency的数组,但是当我将其返回给客户端时为什么它为空?
最佳答案
您传递给Product.findById(item.itemId).then(...)
的回调函数不会立即被调用。您的外部forEach
完成并且您return
在调用任何回调之前。
猫鼬的findById()
方法returns a promise。您可以使用Promise.all()
等待一组诺言完成,然后设置res.status(200).json(...)
。因为这是异步发生的,所以您还应该提供一个异步接口,例如自己返回一个Promise。
这是一个收集所有响应并返回以原始返回值解析的承诺的版本:
var todaysTopItemsBySaleFrequency = [];
return Promise.all(listOfItemIdsAndSaleFrequency.map((item) => {
return Product.findById(item.itemId).then((foundItem) => {
var fullItemData = foundItem.toJSON();
fullItemData.occurrences = item.occurrences;
todaysTopItemsBySaleFrequency.push(fullItemData);
console.log(todaysTopItemsBySaleFrequency);
});
})).then(() => res.status(200).json(todaysTopItemsBySaleFrequency));
关于javascript - 串联使用forEach和mongoose的findById时遇到问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37848128/