mongoose和bcrypt-nodejs没有哈希并保存密码

时间:2017-02-08 22:51:12

标签: node.js mongodb

我正在使用bcrypt-node和mongoose来散列用户密码并将该用户保存到mongo数据库。当我调试下面的代码时,它似乎工作正常,当你在代码中记录密码时,它显示它已经散列,但当你检查数据库时,它仍然是纯文本。我对node和mongoose / mongodb比较新,所以我不确定如何排除故障。我已经尝试将调用next();改为return next(user);,正如另一篇文章中所建议的那样,但这并没有帮助。任何帮助将不胜感激。

我正在使用节点版本6.9.5,mongoose 4.7.0,bcrypt-nodejs 0.0.3和mongo 3.2.10

 UserSchema.pre('save', function (next) {  
      var user = this;
      if (user.password != "") {
        if (this.isModified('password') || this.isNew) {
          bcrypt.genSalt(10, function (err, salt) {
            if (err) {
          return next(err);
        }
        bcrypt.hash(user.password, salt, null, function(err, hash) {
          if (err) {
            return next(err);
          }
          console.log(hash);
          user.password = hash;
          console.log(user.password);
          next();
        });
      });
    } else {
      return next();
    }
  }
  return next();
});

1 个答案:

答案 0 :(得分:2)

您将散列函数放在genSalt()函数之外。此外,您使用了一些难以理解的嵌套和条件。请尝试以下操作,看看它是如何工作的。

UserSchema.pre('save', function(next) {
  const user = this;
  if (!user.isModified('password')) {
    return next();
  }
  bcrypt.genSalt(10, (err, salt) => {
    if (err) {
      return next(err);
    }
    bcrypt.hash(user.password, salt, null, (error, hash) => {
      if (error) {
        return next(error);
      }
      console.log('HASH: ', hash);
      user.password = hash;
      console.log('USER.PASSWORD: ', user.password);
      next();
    });
  });
});

更具可读性,对吧?