为啥不调用带有 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); 为啥不按倒序进行排序呢?

带有 withCredentials 的 Ajax 调用:true 不是在请求中发送 cookie