[英]In Mongoose, what would I use .pre() middleware function for?
[英]How to reuse a pre middleware function in mongoose
我需要在另一个预中间件中重用一个预中间件函数,为此我提取了一个函数,如下所示:
async function encryptPassword(next) {
if (!this.isModified('password')) {
return next();
}
this.password = await bcrypt.hash(this.password, 5);
this.passwordChangedAt = new Date();
next();
}
UserSchema.pre('save', encryptPassword);
UserSchema.pre("findOneAndUpdate", encryptPassword);
但是我收到一个错误,说this.isModified
不是一个函数,我认为this
是指其他东西。 如何解决这个问题?
我在调试器和文档的帮助下深入研究了这些 pre/post 钩子,我发现了几件事(这些适用于pre
和post
):
使用save
钩子意味着this
指的是一个文档本身。 因此,您可以更新其字段,调用isModified
等方法。使用上述方法应该不会有任何问题。
但是, findOneAndUpdate
钩子将意味着this
指的是查询而不是文档。 并且 Query 对象不会有文档或其继承的方法(如isModified
)。
我检查了调试器并可以确认是这种情况(最新的文档)。
钩子列表:https ://mongoosejs.com/docs/middleware.html#types-of-middleware
您将看到只有以下钩子允许修改文档:
validate
save
remove
updateOne
deleteOne
init (note: init hooks are synchronous)
而所有其他人都不会。 这似乎是故意的( https://github.com/Automattic/mongoose/issues/964 )。
为了解决findOneAndUpdate
的问题,似乎唯一的方法(最相似)是将findOne
和updateOne
作为单独的查询进行返工。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.