Node.js 如何使用mongoose模式使用或创建onupdate中间件?

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

有了猫鼬,我们可以在处理数据时使用一些中间件。例如,这是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();
    });
  });
});

我知道这实际上并没有回答这个问题,但如果您的用例只是更新密码,那么您可以使用以下选项:

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();
});