Zenn
💡

Cloudflareに429を返されたのでヘッダーの値を使って無駄なリクエストを送らないようにする

2025/03/22に公開

当たり前の事ですが...できない人も居たのでメモ書き程度に。

DiscordのAPIを使ったプロジェクトを作成中に、うっかりレートリミットに引っかかってしまいました。
Discordのレトリミ制限といえば

{
  message: "You are being rate limited.",
  retry_after: 0.729,
  global: false,
}

こんなJSONが返ってくるのでそこからretry_afterを抜き取ればいいのですが...
まさかのCloudflareのレトリミ(WAF設定)に引っかかっていました。
text/htmlを返してくるのでJSONをパースして~みたいな事はできません。
1秒おきに再試行なんて事しても無駄にCPUとネットワークをいじめるだけです。かっこ悪いです。

この場合、Cloudflareはヘッダーにretry_afterをセットしているので見れば解決します。JavaScriptならこんな感じでやればいいと思います。

async function Getter() {
  const res = await fetch('...');
  if (res.status === 429) {
    const retry_after = (Number(res.headers.get('retry-after')) ?? 60) * 1000;
    setTimeout(() => {
      return Getter();
    }, retry_after);
  }
  // ...
}

それでは。

Discussion

ログインするとコメントできます