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

Express API中MySQL查询结果赋值JS变量返回空数组问题

问题原因及解决方法

核心问题

你的代码存在两个关键问题:

  1. test 函数没有返回创建的Promise对象,导致await test()实际拿到的是undefined(async函数默认返回resolved状态的Promise,值为undefined)
  2. 未处理MySQL查询的错误情况,若查询出错,result可能为空或undefined,且没有触发reject逻辑

修正后的代码

app.get('/api/get/db', async (req, res) => {
  // 包装con.query为Promise
  function test() {
    return new Promise((resolve, reject) => {
      con.query("SELECT * FROM `temp`", (err, result) => {
        // 错误优先处理
        if (err) {
          return reject(err);
        }
        resolve(result);
      });
    });
  }

  try {
    const data = await test();
    res.status(200).json({ data });
  } catch (err) {
    // 处理查询错误,返回错误信息
    res.status(500).json({ error: err.message });
  }
})

更简洁的写法(推荐)

可以用Node.js内置的util.promisify把回调风格的con.query转成Promise风格,避免手动封装:

const util = require('util');
// 把con.query转成Promise版本
const queryAsync = util.promisify(con.query).bind(con);

app.get('/api/get/db', async (req, res) => {
  try {
    const data = await queryAsync("SELECT * FROM `temp`");
    res.status(200).json({ data });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
})

额外注意点

  • 变量data必须用const/let声明,避免全局变量污染
  • 一定要添加错误捕获逻辑(try/catch),否则查询出错时会导致请求挂起或服务器崩溃
  • 确保数据库连接con已正常建立,若连接失败,查询也会返回空或报错

内容的提问来源于stack exchange,提问作者shahin davoodi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:42:40