【问题标题】:mongoose: middleware pre deleteOne options not working猫鼬:中间件预删除一个选项不起作用
【发布时间】:2020-05-17 06:27:34
【问题描述】:

猫鼬的文档说:

Mongoose - Schema-pre

Schema.prototype.pre():
参数:
«String|RegExp» 方法 名称或正则表达式匹配方法名称
[选项] «Object»
[options.document] «Boolean» 如果 name 是文档和查询中间件的挂钩,则设置为 true 以在文档中间件上运行。
[options.query] «Boolean» 如果 name 是文档和 查询中间件,设置为 true 以在查询中间件上运行。
回调«函数»

还有关于 pre hook "deleteOne":
Mongoose - middleware

以下文档功能支持文档中间件。在 文档中间件函数,这里指的是文档:
...deleteOne

以下模型和查询函数支持查询中间件。在查询中间件 >functions 中,这指的是查询:
...deleteOne

所以,deleteOne 在 Document 和 Query 挂钩中,现在让我们尝试使用它:

mySchema.pre('deleteOne', { document: true }, function(next) {
  console.log(this)
  next()
})

结果:这是指查询,而不是文档。为什么?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    哦,从文档中不清楚,'this' 仅指 document#deleteOne 中的文档。

    所以,'deleteOne' 钩子的正确用法是:
    在模型中:

    DocSchema.pre('deleteOne', { document: true }, function(next) {
      console.log(this)
      next()
    })
    

    稍后在代码中(在控制器等中):

    const doc = await DocModel.findOne({ name: 'myDoc' })
    await doc.deleteOne()
    

    现在“this”指的是文档?

    【讨论】:

    • 我们可以在 deleteMany 调用中调用这个预中间件吗?例如,我必须删除对 1 个模型的所有依赖项。但是可移动元素有另一个依赖项,那么我应该在第二个模型中调用什么?
    • 我正在这样做,但它似乎从未达到文档预挂钩
    【解决方案2】:

    需要在选项中添加:{query,false}

    如果不是,pre hook 将运行两次:

    首先是文档 - this 将是文档

    第二个查询 - this 将是查询

    这样写:

    DocSchema.pre('deleteOne', { document: true,query,false }, function(next) {
      console.log(this)
    
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 2021-12-21
      • 2016-07-11
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多