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

时间:2018-04-29 22:27:59

标签: node.js mongoose middleware

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

1 个答案:

答案 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