Mongoose bcrypt 设置密码并异步保存

Mongoose bcrypt set password and saving asynchronously

我有一个猫鼬模式:

UserSchema.methods.setPassword = function (password) {
bcrypt.hash(password, saltRounds).then(function (hash) {
    this.hash = hash;
    }); 
};

下面是我创建用户对象的方式:

router.post('/signup', function(req, res, next){
var user = new User();

user.username = req.body.user.username;
user.email = req.body.user.email;
user.setPassword(req.body.user.password);

user.save().then(function(){
  return res.json({user: user.toAuthJSON()});
    }).catch(next);
});

但是,它保存了没有散列密码的用户。我猜这是因为 bcrypt.hash 回调在调用 user.save 之前没有 运行。我怎样才能最好地解决这个问题?

bcrypt 文档上说不要使用 bcrypt.hashSync,这里合适吗?

UserSchema.methods.setPassword = function (password) {
  return new Promise((resolve, reject) => {
    bcrypt.hash(password, saltRounds, (error, hash) => {
        if (error) {
            reject(error);
        } else {
            this.password = hash;
            resolve(true);
        }
    })
  })
}

然后调用

await user.setPassword(req.body.user.password);

或者捕获错误,idk