Node.js操作MySQL执行多语句查询时无法正确获取字段值怎么办
问题原因
你使用多语句查询时,Node.js的MySQL驱动返回的结果结构和单语句查询完全不同:
- 单语句查询时,
rows直接是当前查询的结果集数组,每个元素是对应行的RowDataPacket对象,所以可以直接用rows[0].piecoin取值 - 开启多语句查询时,
rows是所有语句的结果集组成的数组,每个元素对应一条SQL的查询结果(本身也是一个行数据数组)。你打印rows[0]输出的是[ RowDataPacket { piecoin: 100 } ],说明rows[0]是第一条SQL的结果集数组,而非单条行数据,直接取rows[0].piecoin自然就是undefined。
另外注意,使用多语句查询需要你在创建数据库连接时主动开启配置项multipleStatements: true,否则多语句执行会直接报错。
解决方法
方法1:调整取值逻辑适配多语句结果结构
直接按多语句返回的嵌套结构取值即可,你的两条查询对应取值代码如下:
if (command === "buy") { var query = `select piecoin from coin;` + `select cakecoin from coin;`; database.query(query, (err, rows, field) => { if (err) { console.log(err); } else { // 第一条查询的第一行数据的piecoin字段 const piecoin = rows[0][0].piecoin; // 第二条查询的第一行数据的cakecoin字段 const cakecoin = rows[1][0].cakecoin; console.log(piecoin, cakecoin); // 后续执行余额扣减逻辑即可 } }); }
方法2:使用事务替代多语句拼接(推荐,适配你的购买扣减场景)
你的需求是查询coin数值、再查询用户余额、最后扣减余额,属于需要保证原子性的交易场景,直接拼接多语句不仅容易出错,还存在数据不一致的风险,更推荐使用MySQL事务实现:
if (command === "buy") { // 开启事务 database.beginTransaction(async (err) => { if (err) throw err; try { // 1. 查询piecoin数值 const [coinRes] = await database.promise().query('select piecoin from coin'); const piecoin = coinRes[0].piecoin; // 2. 查询用户余额,此处userId替换为你实际的用户ID参数 const [userRes] = await database.promise().query('select balance from user where id = ?', [userId]); const userBalance = userRes[0].balance; // 3. 校验余额后扣减 if (userBalance >= piecoin) { await database.promise().query('update user set balance = balance - ? where id = ?', [piecoin, userId]); // 提交事务 database.commit(); console.log('购买成功'); } else { // 回滚事务 database.rollback(); console.log('余额不足'); } } catch (e) { database.rollback(); throw e; } }); }
内容的提问来源于stack exchange,提问作者user17555845
相关产品推荐
相关产品推荐

