异步函数中回调返回值导致Promise返回undefined问题求助
问题分析与解决方案
嘿,我来帮你梳理下为啥会拿到undefined,以及怎么修复这个问题~
问题根源
你写的query函数虽然加了async关键字,但本质上没正确处理异步逻辑:
this.connection.query是回调风格的异步API,它不会返回查询结果,而是通过第三个回调函数传递结果/错误。你直接返回的rows其实是这个同步调用的返回值(通常是一个请求对象或者undefined),完全不是回调里的查询结果。- 回调函数里的
return rows也没用,因为这个回调是被数据库驱动调用的,它不会把这个返回值传递给外层的async函数。 - 你的
async函数最终返回了一个resolved状态的Promise,但值是undefined,所以then里拿到的就是undefined。
修复方案:把回调API包装成Promise
async/await是Promise的语法糖,必须基于Promise才能正确处理异步结果。我们需要把回调风格的connection.query包装成Promise,这样async函数才能正确返回异步结果。
修正后的代码如下:
// 改造后的query函数 async query(sql, args) { // 用Promise包裹回调式API return new Promise((resolve, reject) => { this.connection.query(sql, args, (err, rows) => { if (err) { // 出错时reject错误 reject(new Error(err)); } else { // 成功时resolve结果 resolve(rows); } }); }); } // 调用方式不变,现在能拿到正确结果了 db.query("select 1") .then((row) => console.log("Rows", row)) .catch((e) => console.log(e));
如果你更喜欢用await的写法,也可以这么写:
async function fetchData() { try { const row = await db.query("select 1"); console.log("Rows", row); } catch (e) { console.log(e); } } fetchData();
为什么这样能解决问题?
- 我们手动创建了一个Promise,把数据库查询的异步逻辑包裹起来:当查询成功时调用
resolve(rows)传递结果,失败时调用reject(err)传递错误。 async函数会自动处理返回的Promise,外部调用时就能通过then或者await拿到正确的查询结果了。
内容的提问来源于stack exchange,提问作者Maryam Dairkee
相关产品推荐
相关产品推荐

