如何在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
相关产品推荐
相关产品推荐

