Node.js异步函数中实现向数组push元素的解决方案咨询
问题原因
- 你在
Array.map回调中执行的Product.find()是异步数据库操作,未添加await关键字,导致 push 到products数组中的内容都是未完成的 Promise 对象,而非实际的商品查询结果 await直接作用于map方法的返回值无效,map会返回一个由 Promise 组成的数组,需要用Promise.all包裹后再执行await,才能等待所有异步查询执行完成并拿到最终结果- 原代码中
Basket.find()返回的是数组,空数组的布尔值为true,所以!basket判断永远不会触发,无法正确执行未找到购物车数据的逻辑
修复后的可运行代码
try { const basket = await Basket.find({user_id: user._id}) // 修复空数据判断逻辑 if (basket.length === 0) { return res.status(404).send({msg: "not found"}) } // 批量等待所有商品查询完成,直接得到结果数组 const products = await Promise.all( basket.map(item => Product.findById(item.product_id)) ) // 返回查询到的商品数据 return res.status(200).send(products) } catch (e) { res.status(500).send(e) }
可选优化项
- 用
Product.findById(item.product_id)替代Product.find({_id: item.product_id}),语法更简洁,查询效率更高 - 如果不需要对返回的商品数据做Mongoose文档操作,可以在查询后添加
.lean()方法,直接返回普通JS对象,降低性能开销,更适合接口返回场景:Product.findById(item.product_id).lean()
内容的提问来源于stack exchange,提问作者Hasan Rabiee
相关产品推荐
相关产品推荐

