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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:05:32