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

前端发起加购POST请求req.session异常导致商品数量始终为1如何修复

故障根因

有两个核心问题导致前后端调用表现不一致:

  • 前端axios默认不会发送请求凭证(cookie),导致每次前端发起的请求都被后端识别为新会话,session每次都重置,所以加购数量永远是1。Postman默认会自动存储和携带会话cookie,所以调用完全正常,你的session使用本身没问题,是前端请求配置问题导致的session失效。
  • Cart构造函数逻辑存在缺陷,当前的实现仅支持存储单个商品,后续加购不同商品会直接覆盖原有商品,无法实现购物车多商品存储的需求。

修复方案

1. 修复前端请求与后端跨域配置

首先在你的cartService对应的axios实例初始化位置,添加凭证携带配置:

const cartService = axios.create({
  baseURL: '你的后端接口根地址',
  withCredentials: true // 关键配置,允许请求自动携带session cookie
})

同时需要同步修改后端的CORS配置,允许接收前端凭证:

app.use(cors({
  origin: '你的前端服务地址', // 不能使用通配符*,必须填写具体的前端域名
  credentials: true
}))

2. 修复Cart构造函数逻辑

修改实现逻辑,按商品ID区分存储不同商品,支持同商品数量累加:

module.exports = function Cart(oldCart) {
  this.productItems = oldCart.productItems || {};
  this.totalQty = oldCart.totalQty || 0;
  this.totalPrice = oldCart.totalPrice || 0.00;

  this.addProduct = function(item) {
    const itemId = item._id;
    let storedItem = this.productItems[itemId];
    // 该商品从未加购过,初始化条目
    if (!storedItem) {
      storedItem = this.productItems[itemId] = {item: item, qty: 1, price: item.price};
      this.totalQty += 1;
      this.totalPrice += item.price;
    } else {
      // 已有该商品,数量累加
      storedItem.qty++;
      storedItem.price = storedItem.item.price * storedItem.qty;
      this.totalQty++;
      this.totalPrice += storedItem.item.price;
    }
  }
}

3. 优化后端接口逻辑顺序

调整session存储的时机,避免空数据提前写入session:

app.post("/add-to-cart/:id", async (req, res) => {
  try {
      const id = req.params.id;
      
      const { data }  = await axios.get("http://localhost:4200/products");
      const singleProduct = data.find((product) => product._id === id);
      if (!singleProduct) return res.status(404).send('商品不存在');

      let cart;
      if (!req.session.cart) {
        cart = new Cart({});
      } else {
        cart = new Cart(req.session.cart);
      }
      // 先完成加购操作再写入session
      cart.addProduct(singleProduct);
      req.session.cart = cart;
      console.log(req.session.cart)
      res.send(cart);
    
  } catch (error) {
    console.log(error);
    res.status(500).send('加购失败');
  }
});

内容的提问来源于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.05 22:51:00