💡
Cloudflareに429を返されたのでヘッダーの値を使って無駄なリクエストを送らないようにする
当たり前の事ですが...できない人も居たのでメモ書き程度に。
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