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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:54:02