手记

无法保存 bcrypt-nodejs 加密后的密码问题

很多同学学习《node建站攻略(二期)》课程时,遇到注册用户时无法保存加密后的密码的问题。写法大概如下:

var bcrypt = require('bcrypt-nodejs');

// 此处省略无关代码...

bcrypt.hash(user.password, null, null, function (err, hash) {
    user.password = hash; // 注意:这里是异步执行的
    next();
});

我理解的出错的原因是 user.password = hash; 这一步是异步执行的,还没将加密后的值赋值给 user.password 属性时,明文密码已经保存到数据库了。因此,在做登录验证密码时,拿明文密码和加密后的密码比较,自然也就无法通过验证。

可以参考以下写法:

UserSchema.pre('save', function (next) {

  // 此处省略无关代码...

  var hash = bcrypt.hashSync(this.password);
  this.password = hash; // 注意:这里是同步执行的
  next();
});

UserSchema.methods = {
  comparePassword: function (_password, cb) {
    var hash = this.password;
    var isMatch = bcrypt.compareSync(_password, hash);
    cb(null, isMatch);
  }
};

注:本人也是在 node.js 学习阶段,如果理解有误,敬请指正。

1人推荐
随时随地看视频
慕课网APP