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

如何从axios回调外部获取请求返回值 解决调用返回undefined问题

问题根因

控制台打印undefined本质是异步返回值没有正确向外传递:

  • db.query是典型的回调风格异步函数,你写在它回调函数内部的return response.data,只会把值返回给db.query的内部逻辑,完全不会成为外层getEspeciais函数的返回值
  • 你在db.query调用外层写return 'hello'能正常打印,是因为这行代码是同步执行的,直接作为getEspeciais的同步返回值输出,和回调里的异步请求逻辑没有任何关联
修复方案

把回调风格的异步逻辑封装为Promise,在路由层通过async/await等待异步结果返回即可。

  1. 首先改造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);
      }
    });
  });
}
  1. 改造路由处理逻辑,添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:48:22