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

Node.js MySQL异步查询返回undefined问题解决方法

问题原因

你调用接口拿到undefined是三处写法错误导致的:

  • 混用了async/await和回调写法:给db.query传入回调函数时,该方法不会返回Promise,外层的await无法等待查询完成,拿到的值本身无效。同时回调函数内部的return仅在回调作用域生效,不会把结果传递到外层函数。
  • query_my_users_from_db函数没有显式返回值:所有async函数如果没有写return语句,默认返回的Promise resolve结果就是undefined,外层await拿到的自然是undefined。
  • Express路由响应写法错误:直接在路由处理函数里return JSON.stringify(users)不会把内容返回给客户端,必须调用响应对象res的相关方法才能完成响应。
修复方案

按以下规则调整代码即可:

  • 将数据库查询逻辑包装为标准Promise,统一使用async/await写法处理异步结果,不要混写回调
  • 路由中使用res.json()直接返回结构化的用户数据,同时补充错误捕获逻辑,避免查询报错时接口挂起
  • 去掉无意义的Object.values包裹,数据库查询返回的行结果本身就是数组结构,可以直接使用

修复后的可运行代码如下:

app.get("/users", async (req, res) => {
  try {
    const users = await query_my_users_from_db()
    console.log(users)
    // 直接返回JSON响应,无需手动调用JSON.stringify
    res.json(users)
  } catch (err) {
    // 捕获查询异常,返回错误响应
    res.status(500).json({ msg: "查询用户列表失败", err: err.message })
  }
})

async function query_my_users_from_db() {
  // 手动包装回调风格的查询为Promise
  return new Promise((resolve, reject) => {
    db.query("SELECT * FROM `users`", (err, result) => {
      if (err) {
        reject(err)
        return
      }
      // 序列化处理是为了把MySQL返回的RowDataPacket对象转成普通JS对象
      const users = JSON.parse(JSON.stringify(result))
      resolve(users)
    })
  })
}

如果你使用的是mysql2库,可以直接使用官方提供的Promise版本,无需手动包装Promise,写法更简洁:

// 初始化Promise版本的数据库连接
const mysql = require('mysql2/promise')
const db = mysql.createConnection({
  host: 'localhost',
  user: '你的数据库账号',
  password: '你的数据库密码',
  database: '你的库名'
})

// 查询函数可以简化为
async function query_my_users_from_db() {
  // await db.query返回的是[行结果, 字段信息]结构,直接解构拿到行数据即可
  const [users] = await db.query("SELECT * FROM `users`")
  return users
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:01:11