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

Express购物车开发:无法获取旧购物车数据、商品数量始终为1

购物车数据无法读取、商品数量始终为1的修复方案

核心问题1:Cart构造函数addProduct逻辑错误

你当前的代码没有按商品ID区分不同商品,直接将存储所有商品的productItems对象当作单个商品操作,且修改后的数据没有存回原对象,导致每次添加商品都会覆盖旧数据,数量无法累加。

核心问题2:修改后的购物车数据未同步回session

session中仅存储普通JSON对象,你修改Cart实例后没有将最新数据重新赋值给req.session.cart,导致下次请求读取的还是旧数据。

修复后的Cart构造函数代码

module.exports = function Cart(oldCart) {
    this.productItems = oldCart.productItems || {};
    this.totalQty = oldCart.totalQty || 0;
    this.totalPrice = oldCart.totalPrice || 0;
    
    this.addProduct = function(item) {
        const itemId = item._id;
        // 按商品ID读取已存储的对应商品
        let storedItem = this.productItems[itemId];
              
        // 首次添加该商品时初始化
        if (!storedItem){
            storedItem = this.productItems[itemId] = {item: item, qty: 0, price: 0};
        }
        // 累加数量、更新价格
        storedItem.qty++;
        storedItem.price = storedItem.item.price * storedItem.qty;
        this.totalQty++;
        this.totalPrice += storedItem.item.price;
    }
};

修复后的路由代码

app.post("/add-to-cart/:id", async (req, res) => {
  try {
    const id = req.params.id,
      { data } = await axios.get("http://localhost:4200/products"),
      // 数组find为同步方法,无需加await
      singleProduct = data.find((product) => product._id === id);

    let cart;
    if (!req.session.cart) {
      cart = new Cart({});
    } else {
      cart = new Cart(req.session.cart);
    }
    cart.addProduct(singleProduct);
    // 关键:将更新后的购物车数据同步回session
    req.session.cart = cart;
    console.log(req.session);
    // session赋值完成后再跳转,避免数据未持久化
    res.redirect("/");
  } catch (error) {
    console.log(error);
    res.status(500).send('添加购物车失败');
  }
});

你之前怀疑的let cart = new Cart(req.body.cart ? req.body.cart : {});并未在你当前使用的路由代码中出现,不是导致问题的原因。

内容的提问来源于stack exchange,提问作者Jan Tuđan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:24:02