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
相关产品推荐
相关产品推荐

