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

NestJS中使用Axios针对400错误实现1秒间隔重试的最优方案

在NestJS中实现第三方API 400错误的重试机制

针对你遇到的第三方API偶尔返回400错误需要重试的场景,有两种高效实现方式,推荐优先使用成熟库来减少重复代码和边界问题:

方式一:使用axios-retry库(推荐)

这是最省心高效的方案,axios-retry专门为axios封装了重试逻辑,支持自定义重试条件、延迟策略等,无需手动处理定时器和递归细节。

步骤:

  1. 安装依赖:
npm install axios-retry
  1. 在service中配置并使用:
// service.ts
import axios from 'axios';
import axiosRetry from 'axios-retry';

// 全局配置axios重试规则(也可针对单个axios实例配置)
axiosRetry(axios, {
  retries: 3, // 最多重试3次,可按需调整
  retryDelay: () => 1000, // 固定间隔1秒重试
  retryCondition: (error) => {
    // 仅当响应状态码为400时触发重试
    return error.response?.status === 400;
  }
});

async fetchData() {
  try {
    const response = await axios.get('my-api-url');
    // 处理响应数据逻辑
    return response.data;
  } catch (error) {
    // 所有重试失败后的最终错误处理
    throw new Error(`请求最终失败: ${error.message}`);
  }
}

方式二:手动封装重试逻辑

如果不想引入额外依赖,可以手动写递归重试函数,逻辑清晰且灵活:

// service.ts
import axios from 'axios';

async fetchData() {
  // 封装重试逻辑:参数为剩余重试次数、重试间隔(毫秒)
  const retryRequest = async (retriesLeft = 3, delayMs = 1000) => {
    try {
      const response = await axios.get('my-api-url');
      // 处理响应数据
      return response.data;
    } catch (error) {
      // 仅400错误且还有重试次数时才重试
      if (error.response?.status === 400 && retriesLeft > 0) {
        await new Promise(resolve => setTimeout(resolve, delayMs));
        return retryRequest(retriesLeft - 1, delayMs);
      }
      // 不符合重试条件,抛出错误
      throw error;
    }
  };

  try {
    return await retryRequest();
  } catch (error) {
    // 最终错误处理
    throw new Error(`请求失败: ${error.message}`);
  }
}

方案对比

  • 用axios-retry更高效,库已处理超时、请求取消等边缘场景,代码简洁易维护,适合大多数项目。
  • 手动实现适合轻量场景,无需额外依赖,但需自行处理所有边界情况(如重试次数控制、延迟精度等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:45:19