Node.js 如何使用mongoose模式使用或创建onupdate中间件?
有了猫鼬,我们可以在处理数据时使用一些中间件。例如,这是save中间件的一个著名用法:Node.js 如何使用mongoose模式使用或创建onupdate中间件?,node.js,mongoose,middleware,Node.js,Mongoose,Middleware,有了猫鼬,我们可以在处理数据时使用一些中间件。例如,这是save中间件的一个著名用法: Schema.pre('save', function(next){ const user = this; if (!user.isModified('password')) { return next(); } bcrypt.genSalt(10, (err, salt) => { if (err) { next(err); } bcry
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();
});
});
});
我知道这实际上并没有回答这个问题,但如果您的用例只是更新密码,那么您可以使用以下选项:
let userDetails = await User.findOne({ userID: userIDFromRequest });
userDetails.password = request.newPasswordFromRequest;
await userDetails.save();
无需担心散列。此外,如果您确实需要更新挂钩,请尝试下面的代码(未测试):
你可以在这里阅读更多内容:@johnyhk准备好了,我已经修改过了!
UserSchema.pre('update', function(next) {
let update = this._update;
if (update.$set && update.$set.password) {
this.update({}, { password: generateHash(update.$set.password) });
}
next();
});