在Next.js中如何根据购物车商品数量扣减对应产品的库存?
库存扣减逻辑实现方案
基础内存计算实现(满足你当前需要的扣减后结果输出)
实现思路:
- 先将购物车数据转换为ID到购买数量的映射,避免多次遍历购物车数组
- 遍历产品列表时先校验库存是否足够,不足则抛出异常中断流程,避免负库存
示例代码如下:
// 1. 构建购物车商品ID->购买数量的映射 const cartQtyMap = new Map(cartItems.map(item => [item._id, item.qty])) // 2. 遍历产品列表完成库存扣减 const deductedProducts = products.map(product => { const buyQty = cartQtyMap.get(product._id) || 0 // 库存校验 if (product.stock < buyQty) { throw new Error(`商品${product.name}库存不足,当前剩余${product.stock},需要${buyQty}`) } // 返回扣减后的商品对象 return { ...product, stock: product.stock - buyQty } }) console.log(deductedProducts) // 输出的就是你期望的扣减后结果
生产环境推荐实现(避免并发超卖)
上述内存计算的方式仅适合单请求低并发场景,高并发下多个请求同时查询到相同库存,再写回数据库会出现超卖问题,推荐直接用MongoDB原子操作完成库存扣减,无需先查询全量产品:
// 批量构建原子更新操作 const updateOps = cartItems.map(item => ({ updateOne: { filter: { _id: item._id, stock: { $gte: item.qty } // 只在库存足够的时候才更新 }, update: { $inc: { stock: -item.qty } // 原子扣减库存 } } })) // 执行批量更新 const updateRes = await Product.bulkWrite(updateOps) // 校验是否所有商品都扣减成功 if (updateRes.modifiedCount !== cartItems.length) { // 存在商品库存不足,回滚订单逻辑 throw new Error('部分商品库存不足,下单失败') } // 扣减成功后查询最新的产品数据即可 const latestProducts = await Product.find({})
内容的提问来源于stack exchange,提问作者Ahmed Ibrahim
相关产品推荐
相关产品推荐

