はじめに
最近いきなりNotion APIで502エラーが頻発するようになった…💦
502エラーの原因と対処方法を調べたのでまとめる!
この記事で解決したいこと
✅502エラーの原因を知る!
✅今までどおりNotion APIを使った処理をできるようにする!
結論
✅502エラーはNotion側の原因っぽい(?)
✅502エラーが出てもリトライするようにすれば対処できそう!
遭遇した状況
いつもどおり「astro-notion-blog(Notionと連携してブログを書けるやつ)」でブログを更新しようとしたところエラーが発生した😰
ログを見るとNotion APIで502エラーが出ている様子…!
502エラーの原因
✅502エラーはNotion側の問題っぽい(?)
どういうときにエラーが出る?
✅502エラーが出るときと出ないときがあり、具体的にどのような条件で発生するか不明。
上記のページの意見を要約すると
- 大量のブロックを持つページで502エラーが出た🥺
- いやいや、少ないページでも502エラーが出るよ😰
- なんか上手くいくときもあるし、失敗するときもある!現象出るのはランダムかも🤯
502エラーの原因
✅502が出るのはNotion側の問題(?)なので、こちらで502を完全になくすことはできなさそう…
対処方法
本来はNotion側が502エラーが出ないように修正してくれたらベスト◎
しかしいつ修正されるか分からないので、とりあえず動作する対処方法を考える⭐️
とりあえず動作するように対処する方法
「502エラーが出たときはリトライする」ように対処すればOK!!!
具体例
astro-notion-blogの場合の修正内容を抜粋。※言語はTypeScriptだが他の言語でもリトライするように修正すればOK
修正前
502エラーが1回でも出たら中断する。
502エラーに1度でも引っかかるとその時点でアウト!
export async function getAllPosts(): Promise<Post[]> {
省略
let results: responses.PageObject[] = []
while (true) {
const res = (await client.databases.query(
params as any
)) as responses.QueryDatabaseResponse
results = results.concat(res.results)
if (!res.has_more) {
break
}
params['start_cursor'] = res.next_cursor as string
}
省略
}
修正後
400番台以外のエラーなら最大2回までリトライする。
502エラーが2連続で発生することは少ないため、これで処理が通るようになる。
// ✅非同期処理でリトライするのに便利なやつ
import retry from 'async-retry'
const numberOfRetry = 2
export async function getAllPosts(): Promise<Post[]> {
省略
let results: responses.PageObject[] = []
while (true) {
// ✅リトライするように修正(ここから)
const res = await retry(
async (bail) => {
try {
return (await client.databases.query(
params as any
)) as responses.QueryDatabaseResponse
} catch (error: unknown) {
if (error instanceof APIResponseError) {
// ただし400番台のエラーなら繰り返さない
if (error.status && error.status >= 400 && error.status < 500) {
bail(error)
}
}
throw error
}
},
{
retries: numberOfRetry,
}
)
// ✅リトライするように修正(ここまで)
results = results.concat(res.results)
if (!res.has_more) {
break
}
params['start_cursor'] = res.next_cursor as string
}
省略
}
上記の修正で無事にビルドが成功するようになった。
まとめ
ある日突然502エラーが発生して困ったので調べたことをまとめてみて無事に対処できた😊
とりあえず502エラーが出る処理をリトライするようにすれば一時しのぎにはなりそう✅
最後に、リトライ処理もしっかりと対応してくださっているastro-notion-blog様ありがとうございます🙏