猫鼬:中间件预删除一个选项不起作用
Posted
技术标签:
【中文标题】猫鼬:中间件预删除一个选项不起作用【英文标题】: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()
)
结果:这是指查询,而不是文档。为什么?
【问题讨论】:
【参考方案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)
)
【讨论】:
以上是关于猫鼬:中间件预删除一个选项不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为了删除预加载器的 jQuery .load(function) 和 .addClass 不起作用
猫鼬 TTL partialFilterExpression 不起作用?
猫鼬 TTL partialFilterExpression 不起作用?