You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js应用中如何获取bcrypt.hash异步返回的哈希密码存入MySQL

解决方案

你现有代码的核心问题是异步流程顺序错误:bcrypt.hash返回Promise时,哈希运算还没完成,你就直接用原始密码构造参数执行了SQL插入,完全没有用到生成的哈希值。而且你使用promise化的connection.query时错误传入了回调函数,promise版API不需要回调参数。

方案1:async/await写法(推荐,逻辑更清晰)

首先给路由处理函数加上async修饰符,直接用await等待异步操作返回结果:

// 路由处理函数加async修饰
app.post('/register', async (req, res) => {
  try {
    const { email, password } = req.body;
    // 等待哈希密码生成完成
    const salt = bcrypt.genSaltSync(10);
    const hashedPassword = await bcrypt.hash(password, salt);
    // 用哈希后的密码构造SQL参数
    const params = [email, hashedPassword];
    const query = 'insert into users (email, password) values (?,?)';
    // 等待数据库插入完成
    await connection.promise().query(query, params);
    res.status(200).json({
      message: "User created!"
    });
  } catch (err) {
    console.error(err);
    if (err.code === 'ER_DUP_ENTRY') {
      return res.status(400).json({
        message: "There is an account already associated with this email address!"
      });
    }
    res.status(500).json({
      message: "Internal server error"
    });
  }
});

方案2:Promise.then()链式调用写法

如果不想用async/await,可以用你提到的.then()方法,把数据库插入逻辑放到哈希运算的回调里:

app.post('/register', (req, res) => {
  const { email, password } = req.body;
  const salt = bcrypt.genSaltSync(10);
  
  bcrypt.hash(password, salt)
    .then(hashedPassword => {
      // 拿到哈希密码后再执行数据库插入
      const params = [email, hashedPassword];
      const query = 'insert into users (email, password) values (?,?)';
      return connection.promise().query(query, params);
    })
    .then(() => {
      res.status(200).json({
        message: "User created!"
      });
    })
    .catch(err => {
      console.error(err);
      if (err.code === 'ER_DUP_ENTRY') {
        return res.status(400).json({
          message: "There is an account already associated with this email address!"
        });
      }
      res.status(500).json({
        message: "Internal server error"
      });
    });
});

注意事项

  • 必须等待哈希运算完成后,用生成的hashedPassword替换原始密码再构造SQL参数,不要直接把明文密码存入数据库
  • promise化的connection.query不需要传入回调函数,结果可以通过await或者.then()获取
  • 所有异步操作的错误都要统一捕获,避免服务意外崩溃
  • 原代码中的adress为拼写错误,正确拼写为address

内容的提问来源于stack exchange,提问作者Jigau Rafael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:36:03