使用bcrypt存储用户到MySQL时遇data and salt参数缺失错误求助
解决bcrypt的"data and salt arguments required"错误
问题场景
在实现用户注册接口时,使用bcrypt对密码哈希后存入MySQL数据库,出现Error: data and salt arguments required错误。相关代码及完整错误栈如下:
原代码
export const register = (req, res) => { //CHECK EXISTING USER const q = "SELECT * FROM user WHERE email = ? OR username = ?"; db.query(q, [req.body.email, req.body.username], (err, data) => { if (err) return res.status(500).json(err); if (data.length) return res.status(409).json("User already exists!"); //Hash the password and create a user const salt = bcrypt.genSaltSync(10); const hash = bcrypt.hashSync(req.body.password, salt); const q = "INSERT INTO users(`username`,`email`,`password`) VALUES (?)"; const values = [req.body.username, req.body.email, hash]; db.query(q, [values], function (err, data) { if (err) return res.status(500).json(err); return res.status(200).json("User has been created."); }); }); };
完整错误栈
Error: data and salt arguments required at Object.hashSync (/Users/rickyyeung/Desktop/nodejsProject/rick20230510booking/api/node_modules/bcrypt/bcrypt.js:91:15) at Query. (file:///Users/rickyyeung/Desktop/nodejsProject/rick20230510booking/api/controllers/auth.js:14:27) at Query. (/Users/rickyyeung/Desktop/nodejsProject/rick20230510booking/api/node_modules/mysql/lib/Connection.js:526:10) at Query._callback (/Users/rickyyeung/Desktop/nodejsProject/rick20230510booking/api/node_modules/mysql/lib/Connection.js:488:16) at Query.Sequence.end (/Users/rickyyeung/Desktop/nodejsProject/rick20230510booking/api/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24) at Query._handleFinalResultPacket (/Users/rickyyeung/Desktop/nodejsProject/rick20230510booking/api/node_modules/mysql/lib/protocol/sequences/Query.js:149:8) at Query.EofPacket (/Users/rickyyeung/Desktop/nodejsProject/rick20230510booking/api/node_modules/mysql/lib/protocol/sequences/Query.js:133:8) at Protocol._parsePacket (/Users/rickyyeung/Desktop/nodejsProject/rick20230510booking/api/node_modules/mysql/lib/protocol/Protocol.js:291:23) at Parser._parsePacket (/Users/rickyyeung/Desktop/nodejsProject/rick20230510booking/api/node_modules/mysql/lib/protocol/Parser.js:433:10) at Parser.write (/Users/rickyyeung/Desktop/nodejsProject/rick20230510booking/api/node_modules/mysql/lib/protocol/Parser.js:43:10)
错误原因
这个错误的核心是bcrypt.hashSync()的两个参数中,req.body.password为undefined或空值,导致bcrypt无法执行哈希操作。常见触发场景:
- 后端未配置请求体解析中间件(如
express.json()),导致req.body为空对象,无法获取password字段; - 前端请求未正确传递
password字段,或字段名拼写错误(比如传的是pwd而非password); - 代码中存在表名不一致问题(查询用
user表,插入用users表),虽不直接触发当前错误,但可能导致后续其他问题。
修复方案
1. 配置请求体解析中间件
在Express主文件中添加以下代码,解析JSON或URL编码格式的请求体:
const express = require('express'); const app = express(); // 解析JSON请求体 app.use(express.json()); // 解析URL编码的请求体(适配表单提交场景) app.use(express.urlencoded({ extended: true }));
2. 校验必填请求参数
在调用哈希方法前,先检查req.body.password等必填字段是否存在:
if (!req.body.password) { return res.status(400).json("Password is required!"); }
3. 统一数据库表名
将查询和插入的表名统一为users(或user,与数据库实际表名保持一致)。
修复后的完整代码
export const register = (req, res) => { // 校验必填参数 if (!req.body.username || !req.body.email || !req.body.password) { return res.status(400).json("Username, email and password are required!"); } // CHECK EXISTING USER(统一表名为users) const q = "SELECT * FROM users WHERE email = ? OR username = ?"; db.query(q, [req.body.email, req.body.username], (err, data) => { if (err) return res.status(500).json(err); if (data.length) return res.status(409).json("User already exists!"); // Hash the password and create a user const salt = bcrypt.genSaltSync(10); const hash = bcrypt.hashSync(req.body.password, salt); const q = "INSERT INTO users(`username`,`email`,`password`) VALUES (?)"; const values = [req.body.username, req.body.email, hash]; db.query(q, [values], function (err, data) { if (err) return res.status(500).json(err); return res.status(200).json("User has been created."); }); }); };
内容的提问来源于stack exchange,提问作者Rickyforcode
相关产品推荐
相关产品推荐

