如何从axios回调外部获取请求返回值 解决调用返回undefined问题
问题根因
控制台打印undefined本质是异步返回值没有正确向外传递:
db.query是典型的回调风格异步函数,你写在它回调函数内部的return response.data,只会把值返回给db.query的内部逻辑,完全不会成为外层getEspeciais函数的返回值- 你在
db.query调用外层写return 'hello'能正常打印,是因为这行代码是同步执行的,直接作为getEspeciais的同步返回值输出,和回调里的异步请求逻辑没有任何关联
修复方案
把回调风格的异步逻辑封装为Promise,在路由层通过async/await等待异步结果返回即可。
- 首先改造
getEspeciais函数,让它返回Promise实例:
function getEspeciais() { return new Promise((resolve, reject) => { db.query(async (tokenResponse) => { try { const response = await axios.get(URL, { headers: { Authorization: `Bearer ${tokenResponse.accessToken}`, }, }); // 异步请求成功,把结果透传到Promise外层 resolve(response.data); } catch (error) { console.error(error); // 请求失败向外抛出错误 reject(error); } }); }); }
- 改造路由处理逻辑,添加
async标识,用await接收异步返回值,同时记得加错误捕获:
router.get("/", async (req, res) => { try { const data = await especiaisTest.getEspeciais(); console.log(data); // 拿到数据后正常返回给前端即可 res.json(data); } catch (err) { res.status(500).json({ message: "获取特殊数据失败" }); } });
补充说明:如果你用的数据库驱动本身支持Promise写法(比如mysql2的promise版本、主流Node.js ORM),不需要手动嵌套Promise封装,直接
await db.query()即可,代码会更简洁。上述手动封装Promise的写法,仅适配只支持回调风格的异步方法。
内容的提问来源于stack exchange,提问作者Jose Bernardo
相关产品推荐
相关产品推荐

