MERN栈MongoDB环境下更新购物车商品数量的实现咨询
购物车已有商品时的数量更新实现
先修复现有代码的隐含问题
你当前查询购物车使用的是Cart.find(),该方法返回的是符合条件的文档数组,无法直接读取cart.cartItems属性,先将查询逻辑修改为:
// 替换原代码的getCartByUserId部分 let cart; try { cart = await Cart.findOne({ customer: userId }); } catch(err) { const error = new HttpError('查询购物车失败,请稍后重试', 500); return next(error); } // 对应的无购物车判断简化为 if (!cart) { // 原有创建购物车的逻辑保持不变 }
已有购物车分支的逻辑实现
} else { // if cart already exists const { cartItems } = req.body; // 查找购物车中是否已存在相同itemId的商品 const existingItem = cart.cartItems.find(item => item.itemId.toString() === cartItems.itemId ); if (existingItem) { // 已存在则累加数量 existingItem.quantity += cartItems.quantity; } else { // 不存在则新增商品条目 cart.cartItems.push(cartItems); } // 保存更新后的购物车到数据库 try { await cart.save(); } catch(err) { const error = new HttpError('更新购物车失败,请稍后重试', 500); console.log(err); return next(error); } // 返回更新后的购物车数据 res.status(200).json({ cart: cart }); }
关键逻辑说明
- ObjectId类型的字段不能直接用
===比较,需要转为字符串后再匹配,否则永远返回不相等 - 修改购物车数组后必须调用
save()方法将变更持久化到MongoDB - 如果你的请求体
cartItems是批量传入的数组,只需要在外层加一层遍历循环,对每个商品执行上述的存在性判断和数量更新逻辑即可
内容的提问来源于stack exchange,提问作者fraaa
相关产品推荐
相关产品推荐

