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

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);
    }
  }
});

关键修改点

  1. 新增productFound标记,用于记录是否找到匹配的商品
  2. 将push新商品的逻辑移到循环外,只有遍历完所有商品都没匹配时才执行
  3. 将save操作统一放在循环结束后,避免提前返回打断流程
  4. 给olduser添加let声明,修复未声明变量的问题
  5. 使用===替代==,保证严格相等判断
  6. 找到匹配项后用break跳出循环,提升性能

内容的提问来源于stack exchange,提问作者محمد كمال

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:35:25