node.js - mongoose 和 bcrypt-nodejs 不散列和保存密码

标签 node.js mongodb

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

我使用的是 Node 版本 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();
});

最佳答案

您将哈希函数放置在 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();
    });
  });
});

更具可读性,对吧?

关于node.js - mongoose 和 bcrypt-nodejs 不散列和保存密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42125152/

相关文章:

node.js - 如何从node_acl中的特定资源中删除用户的角色?

java - 使用 Java 和 MongoDB 进行参数化查询

javascript - Node-Postgres 查询方法不调用其回调函数

sockets - 用另一种编程语言实现node js的步骤

node.js - 无法在 Centos7 容器中公开 node express 应用程序的端口

mongodb - 如何在 Mongoose 中运行 SlaveOk?

android - 无法根据链接接收对象

mongodb - 电子商务的 NoSQL 数据库

php - Mongodb 不使用 php 获取嵌入式文档

python - 从另一台机器访问digitalocean服务器上的mongodb