Node.js+Mongoose实现库存为0时自动删除商品文档
解决库存为0时自动删除商品并正常重定向的问题
问题根源
原代码的核心问题是异步操作未等待完成:product.save()是异步方法,但你没有用await等待它执行完毕,就直接触发了重定向——这会导致库存更新、商品删除等操作还没完成,页面就已经跳转,最终出现功能异常。
解决方案(无需额外中间件)
直接修改控制器代码,理顺异步操作顺序,加入库存判断逻辑即可:
exports.buyProduct = async (req,res) =>{ try { // 显式转换购买数量为数字,避免字符串运算错误 const boughtItemQuantity = parseInt(req.body.quantity, 10); const product = await Product.findById(req.params.id); // 先校验商品是否存在 if (!product) { return res.status(404).send("目标商品不存在"); } const newQuantity = product.productQuantity - boughtItemQuantity; if (newQuantity <= 0) { // 库存耗尽,直接删除商品文档 await Product.findByIdAndDelete(req.params.id); } else { // 库存剩余,更新后保存 product.productQuantity = newQuantity; await product.save(); } // 所有数据库操作完成后,再执行重定向 res.status(200).redirect("/"); } catch (err) { // 捕获并处理异常,避免服务器崩溃 console.error("购买操作出错:", err); res.status(500).send("购买操作失败,请稍后重试"); } };
关键修改说明
- 强制等待异步操作:给
product.save()、findByIdAndDelete加上await,确保数据库操作完成后再执行后续逻辑。 - 类型安全处理:把
req.body.quantity转为数字,防止前端传入字符串导致的运算错误。 - 库存判断逻辑:计算新库存后,若小于等于0则直接删除商品,否则更新库存。
- 异常捕获:用
try/catch包裹所有异步操作,处理数据库查询、更新时可能出现的错误,同时给用户明确反馈。 - 商品存在性校验:先判断商品是否存在,避免对不存在的资源执行无效操作。
内容的提问来源于stack exchange,提问作者Alim Gölcük
相关产品推荐
相关产品推荐

