繁体   English   中英

在使用Node.js服务器将哈希密码发布到数据库之前,如何在承诺中传递哈希密码?

[英]How to pass a hashed password in a promise before posting it to the database using a Node.js server?

在node.js服务器上,我正在使用bcrypt对用户通过POST请求接收的密码进行哈希处理,然后将该哈希存储在数据库中。 与创建散列和其他参数到数据库的保存相比,散列函数的计算所需的时间更长,因此我需要使用一个承诺在散列函数完成后执行保存。 我正在为此使用Q库,但是我不确定如何执行此操作。 我正在使用猫鼬进行数据建模。

异步bcrypt哈希函数

var bcrypt = require('bcrypt');
  bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash(req.body.password, salt, function(err, hash) {
      // Store hash in DB
    });
  });
});

开机自检路线

app.post('/api/users', function(req, res) {

  var newUser = new User({
    email: req.body.email,
    name: req.body.name,
    password: hash
  });

  newUser.save(function(err) {
    if(!err) {
      return res.send({ status: 'User created' });
    } else {
      if(err.name == 'ValidationError') {
        res.statusCode = 400;
        res.send({ error: 'Bad Request' });
      } else {
        res.statusCode = 500;
        res.send({ error: 'Internal Server Error' });
      }
    } 
  });
});

我会计算newUser变量的填充量,然后newUser.save()调用将成为then()的参数,但是如何使bcrypt哈希函数发出promise并传递哈希呢?

您可以简单地将数据库查询移至哈希的回调内部,以便在哈希回调准备就绪时将其保存。

var bcrypt = require('bcrypt');

app.post('/api/users', function(req, res) {
  bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash(req.body.password, salt, function(err, hash) {
      var newUser = new User({
        email: req.body.email,
        name: req.body.name,
        password: hash
      });

      newUser.save(function(err) {
        if(!err) {
          return res.send({ status: 'User created' });
        } else {
          if(err.name == 'ValidationError') {
            res.statusCode = 400;
            res.send({ error: 'Bad Request' });
          } else {
            res.statusCode = 500;
            res.send({ error: 'Internal Server Error' });
          }
        } 
      });
    });
  });
});

或使用bcrypt.hashSync的同步调用,但是在尝试使用Node时,同步不是一个好习惯。

但这可能就像password: bcrypt.hashSync(req.body.password, salt)

如果我正确理解了您的要求,则要在对密码进行哈希处理之后保存用户吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM