You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:36:00