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

时间:2015-01-12 03:19:55

标签: javascript node.js promise q bcrypt

在node.js服务器上,我使用bcrypt来散列用户通过POST请求接收的密码,然后将散列存储在数据库中。哈希函数函数的计算时间比创建将哈希值和其他参数保存到数据库所需的时间要长,因此我需要使用承诺在哈希函数完成后执行保存。我为此目的使用Q库,但我不知道该怎么做。我正在使用mongoose进行数据建模。

async bcrypt散列函数

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

POST路径

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并传递散列呢?

1 个答案:

答案 0 :(得分:1)

您可以简单地将数据库查询移动到散列的回调内部,这样当散列回调准备就绪时,它会保存它。

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)

如果我正确理解了您的要求,您希望在密码被哈希后保存用户?