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

Express.js异步路由错误处理:捕获Axios请求失败并返回响应

解决Express路由中Axios请求错误无法返回响应的问题

我明白你的问题了——你的Express路由里,当Axios请求失败时,终端能看到错误日志,但客户端收不到任何响应对吧?这是因为你在catch块里只做了日志输出,没有给客户端返回响应内容。

最简单的解决方案

只需要在catch块里添加响应发送逻辑,同时设置合适的HTTP状态码(比如503表示服务不可用,更符合“无法连接”的场景),就能让客户端收到你想要的提示:

router.get('/accounts', async (req, res) => {
  try {
    const response = await axios.get(`${config.url}/accounts`, { auth: config.auth });
    const data = await response.data.results;
    res.json(data);
  } catch (e) {
    console.log(e); // 保留日志方便后续排查问题
    // 给客户端返回错误提示和状态码
    res.status(503).send("Couldn't connect");
  }
});

为什么之前不行?

当请求进入catch块后,你只执行了console.log(e),但没有调用res对象的任何响应方法(比如send、json),客户端会一直处于等待状态,直到请求超时。添加res.status(503).send(...)后,Express会立即给客户端返回指定的状态码和文本内容。

进阶:区分不同类型的错误(可选)

如果你想更细致地处理不同错误场景(比如网络连接失败、目标服务返回HTTP错误码),可以利用Axios的错误类型判断:

router.get('/accounts', async (req, res) => {
  try {
    const response = await axios.get(`${config.url}/accounts`, { auth: config.auth });
    const data = await response.data.results;
    res.json(data);
  } catch (e) {
    console.log(e);
    // 判断是否是Axios相关错误
    if (axios.isAxiosError(e)) {
      if (!e.response) {
        // 无响应,说明是网络连接失败
        res.status(503).send("Couldn't connect");
      } else {
        // 目标服务返回了错误状态码(比如401、500)
        res.status(e.response.status).send(`Request failed: ${e.response.statusText}`);
      }
    } else {
      // 其他非Axios错误(比如代码逻辑错误)
      res.status(500).send("Internal server error");
    }
  }
});

这样可以根据不同的错误场景返回更精准的提示,同时也能保留基础的调试日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 07:03:41