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
相关产品推荐
相关产品推荐

