猫鼬:中间件预 deleteOne 选项不起作用

Max*_*kin 2 mongoose mongodb node.js

猫鼬的文档说:

Mongoose - Schema-pre

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

还有关于预钩子“deleteOne”:
猫鼬 - 中间件

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

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

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

mySchema.pre('deleteOne', { document: true }, function(next) {
  console.log(this)
  next()
})
Run Code Online (Sandbox Code Playgroud)

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

Max*_*kin 9

哦,从文档中不清楚,“this”仅指文档#deleteOne中的文档

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

DocSchema.pre('deleteOne', { document: true }, function(next) {
  console.log(this)
  next()
})
Run Code Online (Sandbox Code Playgroud)

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

const doc = await DocModel.findOne({ name: 'myDoc' })
await doc.deleteOne()
Run Code Online (Sandbox Code Playgroud)

现在'this'指的是文档

  • 我正在这样做,但看起来,它实际上永远不会到达文档预挂钩 (4认同)