Node.js中循环控制Axios GET请求 避免并发过多触发请求超限错误
核心问题排查
- 原代码的for循环是同步执行的,会一次性给所有请求都创建独立的
setInterval定时器,这些定时器会几乎同时触发,根本达不到间隔请求的效果 - Axios请求、saveDetail存储都是异步操作,你没有做流程等待,外层循环不会等前一个请求完成就会执行下一个
saveDetail被你包在无await的异步IIFE里,外层完全感知不到文件是否已经写入完成,导致文件存在性判断经常早于文件写入,逻辑自然不生效setInterval是重复执行的定时器,你没有做清理,还会导致同一个请求被重复触发,进一步加剧并发
修复后的可运行代码
const fs = require('fs/promises') // 用promise版本的fs方便async/await调用 const path = require('path') // 建议用path拼接路径避免系统兼容问题 const axios = require('axios') const instance = axios.create() // 保留你原本的axios实例配置 // 自行调整这两个参数为你实际的路径 const detailDataPath = './你的存储目录/' const sourceData = './你的源JSON文件路径.json' // 工具函数:等待指定毫秒数 const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)) // 保存文件逻辑,返回Promise async function saveDetail(apiData, activeURL) { const idPath = path.join(detailDataPath, activeURL) await fs.writeFile(idPath, JSON.stringify(apiData, null, 2), 'utf8') console.log(activeURL, '保存完成') } // 单个请求+存储逻辑,返回Promise async function getAPI(activeURL, callId) { const idPath = path.join(detailDataPath, activeURL) // 判断文件是否已存在 try { await fs.access(idPath) console.log(activeURL, '已存在,跳过请求') return } catch {} try { console.log(`开始请求第${callId}个:${activeURL}`) const resp = await instance.get(activeURL) await saveDetail(resp.data, activeURL) } catch (error) { console.log(`请求${activeURL}失败,错误码:${error?.response?.status || error.message},callId:${callId}`) // 若需要失败重试可在此处加逻辑,比如最多重试3次再跳过 } } async function mainLoop() { // 读取源文件 const data = await fs.readFile(sourceData, 'utf8') const detailList = JSON.parse(data) // 串行循环,用for循环配合await严格控制执行顺序 for (let i = 0; i < detailList.length; i++) { const activeURL = detailList[i].Id await getAPI(activeURL, i) // 每次请求完成后等待500ms再发下一个,可根据接口限流规则调整数值 await sleep(500) } console.log('全部任务执行完成') } // 启动任务 mainLoop()
改动说明
- 所有异步逻辑全部改为async/await写法,循环内每一步都会等前一个请求+存储+间隔等待全部完成,才会执行下一个,严格串行
- 用
path.join拼接路径,避免不同系统的路径分隔符问题导致的文件存在性判断失效 - 增加sleep工具函数控制请求间隔,你可以根据接口限流规则调整等待毫秒数
- 去掉了所有无效的setInterval和冗余的状态判断逻辑,避免重复请求
- 统一了异常捕获逻辑,你可以在catch块里按需添加失败重试的逻辑
内容的提问来源于stack exchange,提问作者Tex Evans
相关产品推荐
相关产品推荐

