gpt4 book ai didi

javascript - 如何在 Mongoose 中重用预中间件功能

转载 作者:行者123 更新时间:2023-12-04 08:44:19 25 4
gpt4 key购买 nike

我需要在另一个预中间件中重用一个预中间件函数,因为我提取了一个函数,如下所示:

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指的是别的东西。如何解决这个问题?

最佳答案

我在调试器和文档的帮助下深入研究了这些前/后 Hook ,我发现了几件事(这些适用于 prepost ):
使用 save钩子(Hook)意味着 this指文档本身。因此,您可以更新其字段,调用方法如 isModified等。您应该对上述方法没有任何问题。
但是,findOneAndUpdate钩子(Hook)意味着 this指的是 查询 而不是文档。并且 Query 对象不会有文档或其继承的方法(如 isModified )。
我使用调试器进行了检查,可以确认是这种情况(最新的文档)。
钩子(Hook)列表:https://mongoosejs.com/docs/middleware.html#types-of-middleware
您将看到只有以下钩子(Hook)允许修改文档:

validate
save
remove
updateOne
deleteOne
init (note: init hooks are synchronous)
而所有其他人都不会。这似乎是故意的 ( https://github.com/Automattic/mongoose/issues/964)。
解决 findOneAndUpdate 的问题,似乎唯一的方法(最相似)是返工到 findOneupdateOne作为单独的查询。

关于javascript - 如何在 Mongoose 中重用预中间件功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64406124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com