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

Mongoose post remove中间件未触发问题求助

问题原因及解决方案

核心问题

  1. remove()方法报错:Mongoose 6.x及以上版本已移除文档实例的remove()方法,调用shoppingItem.remove()自然会提示"remove is not function"。
  2. post remove中间件不触发:你当前用的是文档实例的deleteOne()方法,但中间件绑定的是remove钩子——这个钩子仅对应已废弃的remove()方法,所以不会被触发。

解决方案

方案1:修改中间件适配deleteOne()方法

直接把中间件的钩子从remove改成deleteOne,匹配你当前使用的文档实例删除逻辑:

ShoppingItemSchema.post("deleteOne", async function () {
  console.log("removing")
  await this.constructor.calculateTotalBoughtCost(this.user);
  await this.constructor.calculateTotalCost(this.user);
});

这里的this依然指向被删除的文档实例,和原有逻辑完全兼容。

方案2:改用模型级删除方法并适配中间件

如果倾向于使用findByIdAndDelete这类模型方法,可同步调整控制器和中间件:

  • 控制器代码修改:
// 替换原有的await shoppingItem.deleteOne();
await ShoppingItem.findByIdAndDelete(req.params.id);
  • 中间件代码修改:
ShoppingItemSchema.post("findOneAndDelete", async function (doc) {
  // 先确认有文档被删除
  if (!doc) return;
  console.log("removing")
  await doc.constructor.calculateTotalBoughtCost(doc.user);
  await doc.constructor.calculateTotalCost(doc.user);
});

这种场景下,findOneAndDelete的post钩子会传入被删除的文档doc,需通过它调用后续计算方法。


额外说明

Mongoose不同删除操作对应不同的钩子:

  • 文档实例操作:deleteOne() → post("deleteOne")
  • 模型批量操作:deleteOne()/deleteMany() → post("deleteOne", { query: true })
  • 模型单条删除:findByIdAndDelete()/findOneAndDelete() → post("findOneAndDelete")

内容的提问来源于stack exchange,提问作者Yonas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:57:32