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

React调用Spotify API触发循环请求及426限流问题求助

修复Spotify API请求无限循环导致的速率限制问题

我正在使用ReactJS与spotify-web-api-node包,通过Spotify API获取个人最常收听的艺人数据,开发中使用了useState和useEffect Hook。运行应用时,getMyTopArtists函数会持续循环执行,直至触发426状态码(代表达到请求速率限制)。请问该如何修复此问题?

相关代码

const [topArtists, setTopArtists] = useState([]);
useEffect(() => {
      if (!accessToken) return
      
      spotifyApi.getMyTopArtists({limit: 5, time_range: 'medium_term'}).then(res => {
        setTopArtists(res.body.items.map(artist => {
          return{
            name: artist.name,
            uri: artist.uri,
            cover: artist.images.uri,
            genre: artist.genres,
          }
        }))
      })
    }, [topArtists, accessToken])

问题原因

无限循环的核心原因是useEffect的依赖数组里包含了topArtists:每次API请求成功后调用setTopArtists更新状态,这会触发useEffect因为依赖项变化重新执行,再次发起API请求,进而再次更新topArtists,形成无限循环,最终触发Spotify的速率限制。

修复方案

  1. 移除不必要的依赖:把topArtists从useEffect的依赖数组中删除,只保留accessToken——我们只需要在accessToken获取到或者变化时才发起请求,请求结果不需要作为触发请求的条件。
  2. 修复图片访问的小问题:artist.images是一个数组,直接访问.uri会报错,应该取数组第一个元素并做可选链处理,避免没有图片时出现错误。

修改后的代码

const [topArtists, setTopArtists] = useState([]);
useEffect(() => {
  if (!accessToken) return
  
  spotifyApi.getMyTopArtists({limit: 5, time_range: 'medium_term'}).then(res => {
    setTopArtists(res.body.items.map(artist => {
      return {
        name: artist.name,
        uri: artist.uri,
        cover: artist.images[0]?.uri,
        genre: artist.genres,
      }
    }))
  })
}, [accessToken]) // 仅保留accessToken作为依赖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:03:31