使用mongoose,我们可以在操作数据时使用一些中间件。例如,这是 save 中间件的着名用法:
Schema.pre('save', function(next){
const user = this;
if (!user.isModified('password')) {
return next();
}
bcrypt.genSalt(10, (err, salt) => {
if (err) {
next(err);
}
bcrypt.hash(user.password, salt, null, (err, hash) => {
if (err) {
next(err);
}
user.password = hash;
next();
});
});
});
我想知道在尝试更新某些记录时如何做同样的事情。我在几个可以使用的论坛中阅读:Schema.pre('update')
,我已经尝试过,但它对我不起作用。想法是在用户想要更改密码时重新加密新密码。我知道,但是我可以在控制器中执行此操作,但我想将此责任从模式中删除。
结果必须是:
Schema.pre('onUpdate', function(next){
const user = this;
if (!user.isModified('password')) {
return next();
}
bcrypt.genSalt(10, (err, salt) => {
if (err) {
next(err);
}
bcrypt.hash(user.password, salt, null, (err, hash) => {
if (err) {
next(err);
}
user.password = hash;
next();
});
});
});
答案 0 :(得分:0)
我知道这实际上并没有回答这个问题,但如果你的用例只是更新密码,你可以使用以下内容:
let userDetails = await User.findOne({ userID: userIDFromRequest });
userDetails.password = request.newPasswordFromRequest;
await userDetails.save();
无需担心散列问题 另外,如果你真的需要更新钩子,请尝试下面的代码(未测试):
UserSchema.pre('update', function(next) {
let update = this._update;
if (update.$set && update.$set.password) {
this.update({}, { password: generateHash(update.$set.password) });
}
next();
});
您可以在此处阅读更多内容:http://mongoosejs.com/docs/middleware.html#notes