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
相关产品推荐
相关产品推荐

