在使用 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
    });
  });
});

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 散列函数发出承诺并传递散列?

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

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)

如果我理解正确的话,你想在密码散列后保存用户吗?