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

如何在Axios批量请求中过滤非200状态码而非触发catch?

解决Axios并发请求过滤非200响应的问题

Axios默认会把非2xx状态码的响应判定为错误抛出,导致axios.all只要有一个请求失败就直接进入catch块。要实现过滤错误响应而非中断所有请求的需求,你可以用以下两种方法:

方法一:修改请求的validateStatus配置

通过validateStatus选项覆盖Axios默认的错误判定逻辑,让所有状态码都被视为成功响应,这样就能收集到所有请求的结果再进行过滤。

try {
  const requests = urls.map((url) => 
    axios.get(url, {
      // 让所有状态码都不触发错误抛出
      validateStatus: () => true
    })
  );
  const responses = await axios.all(requests);

  // 过滤出非200的响应
  const failedResponses = responses.filter(res => res.status !== 200);
  // 提取成功响应
  const successResponses = responses.filter(res => res.status === 200);

  console.log('失败的响应:', failedResponses);
  console.log('成功的响应:', successResponses);
} catch (error) {
  // 这里仅捕获网络错误、DNS解析失败等真正的请求异常
  console.error('请求发生异常:', error);
}

方法二:给单个请求添加catch捕获

如果不想全局修改错误判定逻辑,可以给每个请求单独绑定catch,把错误响应转换成统一格式返回,这样单个请求的错误不会中断整个并发任务。

try {
  const requests = urls.map((url) => 
    axios.get(url)
      .catch(err => {
        // 捕获单个请求的错误,返回错误对应的响应对象
        // 注意:网络错误时err.response可能为undefined,需按需补充默认值
        return err.response || { status: 0, data: '网络请求失败' };
      })
  );
  const responses = await axios.all(requests);

  const failedResponses = responses.filter(res => res.status !== 200);
  const successResponses = responses.filter(res => res.status === 200);

  console.log('失败的响应:', failedResponses);
  console.log('成功的响应:', successResponses);
} catch (error) {
  // 这里几乎不会触发,因为单个请求的错误已被提前捕获
  console.error('未知异常:', error);
}

两种方法的区别:

  • 方法一更直接,适合需要完整获取所有HTTP响应(包括4xx、5xx)的场景;
  • 方法二更灵活,能区分HTTP错误和网络级别的异常,方便做差异化处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:02:43