繁体   English   中英

如何在 mongoose 中重用 pre 中间件功能

[英]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 钩子,我发现了几件事(这些适用于prepost ):

使用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的问题,似乎唯一的方法(最相似)是将findOneupdateOne作为单独的查询进行返工。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM