NodeJS购物车异常:同类商品无法累加数量,重复新增
问题分析与修复方案
你的代码核心问题出在循环内的逻辑顺序和提前返回:
- 遍历购物车商品时,只要当前商品和要添加的不匹配,就直接push新商品并立即保存返回,根本不会检查后续商品是否有匹配项
- 每次循环都执行save和return,导致遍历流程被打断
另外还存在一个小问题:olduser变量未声明,会变成全局变量,需添加let声明。
修复后的代码
// registered user add a new cart or add to cart // router.post("/", verifyToken, async (req, res) => { let olduser = await Cart.findOne({ userId: req.user.id }); if (olduser) { console.log('already found' + olduser); let productFound = false; // 先遍历所有商品,检查是否存在同类型 for (let i = 0; i < olduser.products.length; i++) { if (olduser.products[i].productId.toString() === req.body.productId.toString()) { olduser.products[i].quantity = Number.parseInt(olduser.products[i].quantity) + Number.parseInt(req.body.quantity); productFound = true; break; // 找到匹配项后跳出循环,无需继续遍历 } } // 遍历完所有商品都没找到,再添加新条目 if (!productFound) { olduser.products.push({ productId: req.body.productId, quantity: req.body.quantity }); } // 统一保存修改,放在循环外 try { const updatedCart = await olduser.save(); return res.status(201).send(updatedCart); } catch (err) { return res.status(500).json(err); } } else { const cart = { userId: req.user.id, products: [{ productId: req.body.productId, quantity: req.body.quantity }] }; const newCart = new Cart(cart); try { const savedCart = await newCart.save(); res.status(201).json(savedCart); } catch (err) { res.status(500).json(err); } } });
关键修改点
- 新增
productFound标记,用于记录是否找到匹配的商品 - 将push新商品的逻辑移到循环外,只有遍历完所有商品都没匹配时才执行
- 将save操作统一放在循环结束后,避免提前返回打断流程
- 给
olduser添加let声明,修复未声明变量的问题 - 使用
===替代==,保证严格相等判断 - 找到匹配项后用
break跳出循环,提升性能
内容的提问来源于stack exchange,提问作者محمد كمال
相关产品推荐
相关产品推荐

