【问题标题】:Why mongoose middleware "pre" remove with { query: true } is not called?为什么不调用带有 { query: true } 的 mongoose 中间件“pre”remove?
【发布时间】:2019-07-20 23:52:35
【问题描述】:

我有点卡在这个问题上。 我已阅读有关中间件和一些 stackoverflow 问题的所有 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”函数没有记录任何内容...

欢迎任何帮助。

【问题讨论】:

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


    【解决方案1】:

    这是因为您使用的是 MyModel.deleteOne()。使用 MyModel.remove() 就可以了。

    根据文档:

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

    【讨论】:

    • 我之前使用过 Model.remove(),但那也不起作用……但那是在升级 mongoose(4.13.4 到 5.4.16)之前。你说得对,我今天早上刚刚更新了我所有的电话......谢谢你的帮助
    猜你喜欢
    • 2018-07-05
    • 2022-01-13
    • 2018-09-20
    • 2015-09-25
    • 2018-07-31
    • 2021-08-03
    • 2018-08-11
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多