为啥不调用带有 query: true 的 mongoose 中间件“pre”remove?
Posted
技术标签:
【中文标题】为啥不调用带有 query: true 的 mongoose 中间件“pre”remove?【英文标题】:Why mongoose middleware "pre" remove with query: true is not called?为什么不调用带有 query: true 的 mongoose 中间件“pre”remove? 【发布时间】:2019-07-20 23:52:35 【问题描述】:我有点卡在这个问题上。 我已阅读有关中间件和一些 *** 问题的所有 mongoose 文档,但无法找出如何在不重复查询的情况下解决我的问题(查找然后删除)。
通常,当从模型调用而不是从文档调用时,删除前的中间件不会触发。但是根据the doc,如果我添加 query: true,我的函数将从模型查询中调用。
我使用的是最新的猫鼬版本(5.4.16)
这是我的代码。
let mySchema= new mongoose.Schema(
name: String,
comment: String
, usePushEach: true );
mySchema.pre('remove', document: true , function()
console.log('remove document');
);
mySchema.pre('remove', query: true , function()
console.log('remove');
);
const MyModel = mongoose.model('MyModel', mySchema);
这里的电话
MyModel.deleteOne( _id: modelId , (errorRm) =>
if (errorRm)
return res.json( success: false, message: `$errorRm.message` );
return res.json( success: true, message: 'Model successfully removed' );
);
模型已成功删除,但“pre”函数没有记录任何内容...
欢迎任何帮助。
【问题讨论】:
【参考方案1】:这是因为您使用的是 MyModel.deleteOne()。使用 MyModel.remove() 就可以了。
根据文档:
您可以将选项传递给 Schema.pre() 和 Schema.post() 以切换 Mongoose 是否为 Document.remove() 或 Model.remove() 调用您的 remove() 钩子:
【讨论】:
我之前使用过 Model.remove(),但那也不起作用……但那是在升级 mongoose(4.13.4 到 5.4.16)之前。你说得对,我今天早上刚刚更新了我所有的电话......谢谢你的帮助以上是关于为啥不调用带有 query: true 的 mongoose 中间件“pre”remove?的主要内容,如果未能解决你的问题,请参考以下文章
Power Query (M) 使用带有 API 的函数获取信息
为啥 ?XDEBUG_PROFILE=true 被 mod_rewrite 忽略?
为啥 Power Query 调用 Azure API 管理后端 URL?
为啥此输入类型=时间在某些带有“stepMismatch”的浏览器中无效:true?
linq ,语句是 query = query.OrderByDescending(NewsTj => NewsTj.Id); 为啥不按倒序进行排序呢?