为什么不调用用{query:true}删除的猫鼬中间件“ pre”?

时间:2019-02-27 09:46:29

标签: javascript node.js mongodb mongoose mongoose-schema

我对此问题有些困惑。 我已经阅读了所有有关中间件的猫鼬文档和一些stackoverflow问题,并且无法找到如何解决我的问题而又不重复查询(先查找再删除)。

通常,从Model而不是从文档调用时,在remove上的中间件不会触发。但是根据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 个答案:

答案 0 :(得分:0)

这是因为您正在使用 MyModel.deleteOne()。使用 MyModel.remove(),它将起作用。

根据文档:

  

您可以将选项传递给Schema.pre()和Schema.post()来切换Mongoose是调用Document.remove()还是Model.remove()的remove()钩子: