React+Express开发中custID值无法传入insert SQL语句问题求助
问题原因
db.query 属于异步回调方法,代码执行时不会等待IDStmt的查询回调执行完成,就会直接往下执行后续的插入、更新SQL语句。此时custID还没被查询结果赋值,仍然是初始的空字符串,因此会出现控制台能打印正确的custID,但插入语句拿不到有效值的问题。
解决方案
推荐使用async/await的写法解决异步时序问题,可读性更高,也避免回调嵌套地狱。首先需要将你的数据库连接切换为支持Promise的版本,比如使用mysql2/promise库,修改后代码如下:
// 引入mysql2的promise版本 const mysql = require('mysql2/promise'); // 初始化db连接示例(替换你原有db初始化逻辑) const db = mysql.createPool({ host: '你的数据库地址', user: '用户名', password: '密码', database: '库名' }); app.post("/api/Cust", async (req, rsp) => { try { const func = req.body.func; const { custName, IC, gender, custDOB, addr1, addr2, addr3, country, email, hp } = req.body; let custID = ''; console.log("inside db code"); console.log(req.body.func); if (func === "new") { // 等待ID查询完成再执行后续逻辑 const IDStmt = "select concat('TP-',lpad(nextcust,6,'0')) as nextcust from autoref;"; const [result] = await db.query(IDStmt); result.map(e => { custID = e.nextcust }); console.log(custID); // 执行插入逻辑 const sqlStmt = "insert into cust_master (custID, custName, IC, MaleFemale, Birthday, Street, BLK, City, Country, Email, HP, register_date) values ( ?,?,?,?,?,?,?,?,?,?,?,curdate() );"; await db.query(sqlStmt, [custID, custName, IC, gender, custDOB, addr1, addr2, addr3, country, email, hp]); // 执行更新序号逻辑 const updStmt = "update autoref set nextcust = nextcust + 1;" await db.query(updStmt); rsp.status(200).json({ code: 0, msg: '新增成功', custID }); } } catch (err) { console.error('操作异常:', err); rsp.status(500).json({ code: 1, msg: '操作失败', error: err.message }); } })
如果你不想调整现有数据库连接的依赖,也可以直接把插入、更新逻辑放到ID查询的回调内部,保证拿到custID之后再执行后续操作:
if (func==="new") { const IDStmt = "select concat('TP-',lpad(nextcust,6,'0')) as nextcust from autoref;"; db.query( IDStmt, ( err, result) => { if(err) { console.log(err); return rsp.status(500).json({msg: '查询ID失败'}); } result.map( e => { custID = e.nextcust }); console.log(custID); // 插入、更新逻辑放到查询回调内部 const sqlStmt = "insert into cust_master (custID, custName, IC, MaleFemale, Birthday, Street, BLK, City, Country, Email, HP, register_date) values ( ?,?,?,?,?,?,?,?,?,?,?,curdate() );"; db.query( sqlStmt, [custID, custName, IC, gender, custDOB, addr1, addr2, addr3, country, email, hp], ( err, result) => { console.log(err); }) const updStmt = "update autoref set nextcust = nextcust + 1;" db.query( updStmt, ( err, result) => { console.log(err); }) }) }
补充说明
建议给ID查询、客户插入、序号更新三个操作加事务管控,避免出现插入失败但序号已经累加的数据不一致问题。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

