继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

王益达
关注TA
已关注
手记 38
粉丝 104
获赞 631

很多同学学习《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 学习阶段,如果理解有误,敬请指正。

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP