Mongoose post remove中间件未触发问题求助
问题原因及解决方案
核心问题
remove()方法报错:Mongoose 6.x及以上版本已移除文档实例的remove()方法,调用shoppingItem.remove()自然会提示"remove is not function"。- 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
相关产品推荐
相关产品推荐

