Node.js中MySQL查询填充数组始终为空的问题求助
问题解决:Node.js异步MySQL查询导致数组未填充
你的核心问题确实是异步操作时序问题:con.query是异步执行的,你的console.log和res.render会在所有数据库查询完成前就运行,所以此时data数组还没被赋值,自然显示为空。另外你的代码还有几个需要修正的问题:后端不能用alert(这是浏览器端API)、变量未声明会导致全局污染、重复代码冗余。
下面是修复后的完整代码,用async/await处理异步,确保所有查询完成后再渲染页面:
// Route to display current data for multiple product updates. app.get('/prod_multi_upd_pg', async (req, res) => { try { const prod_id_arr = req.query.prod_id_arr?.split(',') || []; const data = new Array(8); // 封装查询为Promise,方便用await const getProduct = (prodId) => { return new Promise((resolve, reject) => { con.query('SELECT * FROM product WHERE prod_id = ?', [prodId], (err, rows) => { if (err) return reject(err); resolve(rows); }); }); }; // 遍历处理每个产品ID for (let i = 0; i < prod_id_arr.length; i++) { const prodId = prod_id_arr[i]; if (!prodId) continue; const rows = await getProduct(prodId); if (rows.length === 0) { // 后端不能用alert,改用响应提示 return res.send("Ürün kodu bulunamadı, lütfen geçerli bir ürün kodu girin."); } data[i] = rows; } console.log("data: ", data); res.render("prod_multi_upd_pg", { data }); } catch (err) { console.error('数据库查询出错:', err); res.status(500).send('服务器内部错误'); } });
关键改动说明:
- 异步处理:把路由回调改成
async函数,将con.query封装成Promise,用await等待每个查询完成,确保data数组在渲染前被填充。 - 变量声明:用
const/let声明所有变量,避免全局污染。 - 错误处理:添加
try/catch捕获数据库查询和路由执行中的错误,避免服务崩溃。 - 替代alert:后端无法调用浏览器的
alert,改用res.send返回错误提示,也可以用flash消息配合前端实现更友好的提示效果。 - 代码简化:用循环替代重复的if判断,减少冗余代码,同时支持任意数量的产品ID(不再局限于3个)。
如果你的MySQL客户端支持Promise(比如mysql2库),可以进一步简化代码:初始化连接时改用Promise版本,直接await查询结果,无需手动封装Promise:
// 初始化连接时改用promise版本 const con = mysql.createConnection(你的配置).promise(); // 路由内直接使用await查询 const rows = await con.query('SELECT * FROM product WHERE prod_id = ?', [prodId]);
内容的提问来源于stack exchange,提问作者user16617036
相关产品推荐
相关产品推荐

