NestJS中使用Axios针对400错误实现1秒间隔重试的最优方案
在NestJS中实现第三方API 400错误的重试机制
针对你遇到的第三方API偶尔返回400错误需要重试的场景,有两种高效实现方式,推荐优先使用成熟库来减少重复代码和边界问题:
方式一:使用axios-retry库(推荐)
这是最省心高效的方案,axios-retry专门为axios封装了重试逻辑,支持自定义重试条件、延迟策略等,无需手动处理定时器和递归细节。
步骤:
- 安装依赖:
npm install axios-retry
- 在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
相关产品推荐
相关产品推荐

