我已经花了6个小时试图弄清楚如何在NodeJS中做到这一点.
我正在将NodeJS与Express和MongoDB一起使用.
我有一个数据库,有两个集合,即.列表和类别.每个 list 都有一个"CATEGORY",它是映射到Categories集合中的一个类别的ID.
我想要做的是,获取所有 list ,然后遍历所有 list ,并使用类别id从Categories集合中获取类别标题.
这就是我得到所有房源的原因:
const listings_raw = [];
await db.collection("listings").find().forEach(listing => listings_raw.push(listing));
上面的代码运行良好.我现在遇到的麻烦是:
const listings = [];
listings_raw.forEach(async listing => {
const category_id = listing.category;
const category_title = await db.collection('categories').findOne({_id: objectId(category_id)});
listing.category_title = category_title;
listings.push(listing);
});
response.send(listings);
在listings_raw.forEach
完成之前,response.send(listings);
被执行.
我想发送的数据后,所有的 list 已经填充了类别标题.
在花了6个小时后,我想出了下面的黑客,我肯定这是令人讨厌的!
const listings_raw = [];
const em = new events.EventEmitter();
await db.collection("listings").find().forEach(listing => listings_raw.push(listing));
const listings = [];
let counter = 0;
listings_raw.forEach(async (listing) => {
const category_id = listing.category;
const category = await db.collection('categories').findOne({_id: objectId(category_id)});
listing.category_title = category.title;
listings.push(listing);
if (counter === listings_raw.length - 1) {
em.emit('listings:processing:done');
}
counter++;
});
em.on('listings:processing:done', () => {
response.send(listings);
});
请问,有没有人可以解释或指导我应该如何用JavaScript来完成这项工作?
基本上,我不知道如何知道所有的promise 是否都得到了解决.
谢谢!