Array.push在while循环内运行正常,循环外得到空数组是什么原因?
问题原因分析
1. 根因:异步回调执行顺序错位
mysql模块的query方法是非阻塞异步API,调用后会立刻返回,不会等待数据库操作完成再执行后续代码。
你写的代码执行顺序是:
- while循环瞬间跑完所有迭代,把所有数据库请求全部发送出去,变量i直接加到和count相等
- 主线程立刻执行循环后的
console.log(idList)和res.json(idList),此时还没有任何一个query的回调函数被触发,idList自然是空数组 - 等数据库逐个返回操作结果后,才会执行回调里的
idList.push(cId)逻辑,这时候你早就已经返回响应了,所以会出现「内部打印有值、外部读取为空」的现象。
2. 其他隐藏问题
- 语法错误:UPDATE语句拼接时
insertID和where之间缺少+号,运行时会直接抛出语法错误 - 变量未声明:
i、idList、insertID、Q均未显式声明作用域,默认会变成全局变量,并发请求时会出现变量互相覆盖的异常 - SQL注入风险:直接拼接SQL字符串,没有使用参数化查询,存在安全漏洞
- 连接未释放:每次请求新建数据库连接但未关闭,会很快耗尽数据库连接池,导致后续请求无响应
修复方案
建议使用mysql2的promise版本,配合async/await把异步逻辑改成同步写法,避免回调地狱:
// 先安装依赖:npm install mysql2/promise const mysql = require('mysql2/promise'); this.router.post('/hello', async(req, res) =>{ console.log("We are in"); // 建议把连接配置抽成全局配置,不要每次请求都写一遍 const connection = await mysql.createConnection({ host : 'host12', user : 'root12', password : 'password12', database : 'db12', }); try { const count = req.body.count; console.log("the count:" + count); const idList = []; const Q = '你之前的Q变量定义补这里'; // 补上你原来Q的取值逻辑 for(let i=0; i<count; i++) { // 参数化查询避免注入 const [insertResult] = await connection.query( 'INSERT INTO x (DateM) VALUES (?)', ['2021-10-10'] ); const insertID = insertResult.insertId; await connection.query( 'UPDATE table SET mitID = ? where ID = ?', [insertID, insertID] ); const cId = Q + insertID; idList.push(cId); } console.log(idList); res.json(idList); } catch (err) { console.log('操作错误:', err); res.status(500).json({error: '操作失败'}); } finally { // 用完关闭连接 await connection.end(); } });
内容的提问来源于stack exchange,提问作者Sreenath Umagandhi
相关产品推荐
相关产品推荐

