You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 00:03:20