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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:30:36