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

如何让Axios依次尝试多个API请求URL,请求成功即返回数据

现有代码的问题

你当前使用axios.all的写法是并行发起所有密钥对应的请求,完全不符合“依次尝试、成功即返回”的需求,反而会一次性消耗所有密钥的请求配额,和多密钥轮询分流的核心目标完全相悖。

核心实现思路
  • 维护统一的API密钥池,将所有可用的YouTube API Key存入数组按使用优先级排序
  • 采用串行逻辑遍历密钥池发起请求:用当前密钥请求成功就直接返回结果,终止后续尝试
  • 增加错误类型判断:仅当请求触发「配额超限」类错误时,才切换到下一个密钥重试;如果是参数错误、视频不存在、网络异常等和密钥配额无关的错误,直接抛出终止请求,避免无效调用
  • 增加兜底逻辑:所有密钥都尝试失败后,抛出明确的业务错误,方便上层逻辑处理
  • 可选优化:给触发过配额超限的密钥增加冷却机制,配额重置前不再调用,进一步减少无效请求
可直接落地的代码实现
const axios = require('axios');

// 填入你申请的所有YouTube API密钥,按使用优先级排序
const YOUTUBE_API_KEYS = [
  'YOUR_FIRST_API_KEY',
  'YOUR_SECOND_API_KEY',
  'YOUR_THIRD_API_KEY'
];
const YOUTUBE_VIDEO_API = 'https://www.googleapis.com/youtube/v3/videos';

async function getYoutubeVideoSnippet(id) {
  let finalError = null;

  for (const currentKey of YOUTUBE_API_KEYS) {
    try {
      const res = await axios.get(YOUTUBE_VIDEO_API, {
        params: {
          part: 'snippet,contentDetails,statistics',
          id: id,
          key: currentKey
        }
      });
      // 请求成功直接返回结果,不再尝试后续密钥
      return res.data;
    } catch (err) {
      finalError = err;
      // 判断是否为YouTube API返回的配额超限错误
      const isQuotaLimit = err.response?.status === 403 
        && err.response?.data?.error?.errors?.some(item => item.reason === 'quotaExceeded');
      
      // 非配额类错误直接抛出,不做重试
      if (!isQuotaLimit) throw err;
      // 配额超限则打印提示,进入下一轮循环切换密钥
      console.warn(`密钥${currentKey.slice(0, 6)}***配额已用尽,自动切换下一个密钥`);
    }
  }

  // 所有密钥均尝试失败
  throw new Error('所有可用API密钥配额均已耗尽,请补充密钥或等待配额重置', { cause: finalError });
}
使用注意事项
  • 绝对不要用Promise.all/axios.all实现多密钥轮询:并行请求会同时占用所有密钥的配额,完全起不到分流作用,串行重试的配额利用率最高
  • 不要所有错误都触发重试:参数错误、资源不存在、密钥权限被封等问题换密钥也无法解决,直接抛出即可,避免浪费请求
  • 高流量场景可以扩展密钥调度逻辑:比如记录每个密钥的最近超限时间,YouTube API配额按太平洋时间每日重置,可以把24小时内触发过超限的密钥暂时移出可用池,减少无效请求
  • 如果需要更高的可用性,可以在请求层增加超时控制,避免单个密钥请求长时间挂起影响整体响应速度

内容的提问来源于stack exchange,提问作者Dương Tùng Anh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:42:42