如何在mongoose中使用async Wait和map?

omtl5h9j  于 2021-09-23  发布在  Java
关注(0)|答案(2)|浏览(351)
const mapLoop = async _ => {
        console.log('Start')

        const promises = books.forEach( async (book) => {
            const ownerInfos = await User.find({_id: book.Owner})  
            return ownerInfos;

        })

        const ownerInformation = await Promise.all([promises])
        console.log(ownerInformation)

        console.log('End')
      }

 mapLoop();

books变量由对象组成,每个对象的键值对为namebook、editionbook、_id和owner(这是一个id)。我想在这里做的是通过存储在值“owner”中的id找到书的所有者。但是,ownerinformation变量未定义。

8nuwlpux

8nuwlpux1#

forEach 不返回任何内容(它在适当的位置对数组进行了变异),因此 promises 将始终是未定义的。使用 map 而是返回一个新数组。
没有必要这样做 map 回调是异步的,并且不需要 await 这个 find 过程只需回报承诺。 promises 现在将是一个数组,因此不需要在 Promise.all .

const promises = books.map(book => {
  return User.find({ _id: book.Owner });
});

const ownerInformation = await Promise.all(promises);

console.log(ownerInformation);
twh00eeo

twh00eeo2#

forEach() 用于对每个数组元素执行操作,不会返回新数组。它也不尊重 async/await . 所以,在任何数据库调用实际完成之前就到达了下一行,这并不重要。用你的 promises 未定义的: await Promise.all([undefined]) 返回 [undefined] 尝试将books数组直接Map到promises数组。现在,承诺是一系列的承诺 promises 你可以用 Promise.all 具有 await 为了得到你的结果。

const promises = books.map(book => User.find({_id: book.Owner});  

const ownerInformation = await Promise.all(promises)
console.log(ownerInformation)

但是,您可以进行一个优化,只需进行一个数据库查询,其中包含您所有的 _id S这将使用$in()运算符,用于搜索给定数组中的字段值:

const bookOwnerIds = books.map(book => book.Owner);
const ownerInformation  = await User.find({'_id': { $in : [bookOwnerIds] });

另外,请检查您的 .bookOwner 是mongoose对象id所期望的正确格式。如果没有,您可能需要使用以下内容 mongoose.Types.ObjectId(book.Owner) 在上述两种情况下。

相关问题