为什么我的 mongoose 文档没有在 bcrypt 函数中正确更新?

Why isn't my mongoose document updated properly inside of the bcrypt functions?

我正在尝试在对文档调用保存之前对密码进行哈希处理。我尝试生成一个散列(效果很好),然后用新的散列密码更新文档的密码字段(字符串类型)。

然而,user.password = hash 行没有任何改变。

我检查了我的数据库,没有任何改变!更奇怪的是,如果我尝试在 外部 hash/bcrypt 函数中更改我的文档数据,它工作正常。

例如,如果我用密码 "fake1" 初始化我的文档,然后将 user.password = "fakepassword" 放在我的散列函数之外,它会很好地更新它。 ...

这是为什么?输入散列函数后,引用 this 会发生变化吗?我见过的每个例子(我已经搜索了几个小时)都和我的一模一样……为什么我的不起作用?

userSchema.pre('save', function(next) {   
    var user = this; // i reference the doc by "this"
    bcrypt.genSalt(SALT_WORK_FACTOR, function(err,salt){    
        if(err){  
            console.log("error with salt \n");  
        }  
            bcrypt.hash(user.password,salt,function(error,hash){  
                if (error){  
                    console.log("error with hash \n");  
                }  
                user.password = hash; // this line doesn't do anything!  

            });  
   });        
   return next(user);                                                                                                                                                    
}); 

您应该在异步 bcrypt 代码完成后调用 next()。现在,您无需等待 bcrypt.genSalt/bcrypt.hash.

的结果即可调用它

此外,传递给 next 的参数是为错误保留的。如果一切顺利,你应该调用 next 而不带任何参数。

这是中间件的清理版本:

userSchema.pre('save', function(next) {
  var user = this;
  bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
    if (err) {
      console.log("error with salt \n");
      // Pass error back to Mongoose.
      return next(err);
    }
    bcrypt.hash(user.password, salt, function(error, hash) {
      if (error) {
        console.log("error with hash \n");
        return next(error);
      }
      user.password = hash;
      // Here are we done with the bcrypt stuff, so it's time to call `next`
      next();
    });
  });
});