如何将客户端传来的JSON对象存入MySQL数据库?
如何将JSON数据存入MySQL数据库
Got it,咱们一步步来搞定把JSON数据存入MySQL的问题,重点要兼顾安全性和正确性:
首先,先确认你已经安装了合适的MySQL驱动——推荐用mysql2,它支持Promise和更现代的特性,比旧版mysql包好用不少。如果还没装,先跑这个命令:
npm install mysql2
1. 先搞定数据库连接(推荐用连接池)
单个数据库连接效率低,用连接池能更好地复用连接,避免频繁创建销毁的开销:
const mysql = require('mysql2/promise'); // 用Promise版本,方便异步操作 // 配置你的数据库信息 const pool = mysql.createPool({ host: '你的数据库主机地址', user: '数据库用户名', password: '数据库密码', database: '你的目标数据库名', connectionLimit: 10, // 最大连接数 waitForConnections: true });
2. 完善POST接口的插入逻辑
这里有几个关键细节要注意:
- 绝对不能直接拼接SQL字符串!要用参数化查询(占位符
?)防止SQL注入,这是安全底线。 - 你的
dob是DD-MM-YYYY格式,MySQL的DATE类型要求YYYY-MM-DD,得先转格式;如果你的表dob字段是VARCHAR,可以跳过转换,但更推荐存成DATE类型方便后续查询。 - 数据库操作是异步的,用
async/await让代码更易读。
完整的接口代码如下:
app.post('/addUser', async function (req, res) { try { // 从请求体里解构出需要的数据 const { registerationId, firstName, lastName, dob, cnic, gender } = req.body; // 转换日期格式:DD-MM-YYYY → YYYY-MM-DD const [day, month, year] = dob.split('-'); const formattedDob = `${year}-${month}-${day}`; // 执行参数化插入查询 const [result] = await pool.execute( 'INSERT INTO students (registrationId, firstName, lastName, dob, cnic, gender) VALUES (?, ?, ?, ?, ?, ?)', [registerationId, firstName, lastName, formattedDob, cnic, gender] ); // 插入成功后返回友好响应 res.status(201).json({ message: '用户添加成功', insertedUserId: result.insertId // 返回插入数据的主键ID }); } catch (error) { // 捕获并处理错误,比如重复的registrationId、数据库连接失败等 console.error('插入数据出错:', error); res.status(500).json({ message: '添加用户失败', error: error.message }); } });
3. 确保你的students表结构匹配
你的数据库表得有对应的字段,比如可以用这个SQL创建表:
CREATE TABLE students ( id INT AUTO_INCREMENT PRIMARY KEY, registrationId INT NOT NULL UNIQUE, -- 注册ID设为唯一,避免重复插入 firstName VARCHAR(50) NOT NULL, lastName VARCHAR(50) NOT NULL, dob DATE, cnic BIGINT, -- 如果身份证号有前导零,建议改成VARCHAR(15)类型 gender ENUM('Male', 'Female', 'Other') NOT NULL, createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
额外注意事项
- 数据验证:最好在插入前对用户输入做验证(比如检查
dob格式是否合法、cnic长度是否符合要求),可以用express-validator或者joi这类库。 - 错误细分:如果是唯一键冲突(比如registrationId重复),可以在catch里判断错误码,给客户端返回更精准的提示,比如“该注册ID已存在”。
内容的提问来源于stack exchange,提问作者dev90
相关产品推荐
相关产品推荐

