Mongoose中remove post钩子未触发问题求助(Node.js)
解决Mongoose中remove post钩子未触发的问题
Hey,我看你遇到了Mongoose里remove post钩子不触发的问题,这其实是个很常见的小细节问题,我来帮你分析解决:
核心原因
你现在控制器里用的是List.remove(list)这种模型级别的remove方法,但你在Schema里定义的post('remove')是文档实例级别的钩子——只有调用具体文档对象的remove()方法时,这个钩子才会被触发,模型的remove()/deleteOne()这类方法不会触发它。
具体修改方案
你已经通过List.findOne()成功拿到了文档实例list,直接调用这个实例的remove()方法就可以触发钩子了,不需要再用模型的remove()方法。
修改后的控制器代码:
List.findOne({_id: req.params.list_id}, function(error, list) { if(list){ // 调用文档实例的remove方法,而非模型的remove方法 list.remove(function(err){ if(err) res.send("no"); else res.send("yes"); }); } else { console.log("no"); } });
验证效果
修改后,当你执行删除操作时,Schema中定义的post('remove')钩子就会正常触发,自动删除所有关联的Item数据了。
额外补充(可选)
如果之后你需要用模型级别的删除操作(比如直接通过条件删除,不先查询文档),那需要定义对应的模型级别钩子,比如针对deleteOne的钩子:
// document: true 表示这个钩子在文档实例调用deleteOne时也会触发,query: false表示忽略查询级别的deleteOne listSchema.post('deleteOne', { document: true, query: false }, function(lists) { Item.remove({_list: lists.id}, function(error, items){ if(items) console.log("yes"); else console.log("no"); }); });
不过就你当前的代码逻辑来说,直接用文档实例的remove()是最适配现有钩子的方案。
内容的提问来源于stack exchange,提问作者Dhruv Koshiyar
相关产品推荐
相关产品推荐

