https://developer.nulab.com/ja/docs/backlog/api/2/get-issue-list/ のページ
Backlogのプロジェクトの全課題を取得したい
と思って簡単に実装をしてみたところ、問題が発生しました。
Backlogの課題はGET /api/v2/issues で取得できますが、瞬間的に多数のリクエストを投げるとエラーを返されてしまいます。
ですので、全課題を取得したいときはサーバーの負荷を上げすぎないように時間あたりのリクエスト数をへらす必要があります。
出来上がったコード
export const getIssues = async (params={}) => {
if (issuesCache.length > 0) {
return issuesCache
}
return new Promise(async (resolve, reject) => {
let issues = []
let offset = 0
const count = 100
const interval = 500
const max = 100
const intervalId = setInterval(async () => {
const result = await key_request("GET", `issues`, {
...params,
count,
offset:offset*count
})
if ((!result.response.ok)||(result.length == 0)||(offset > max)) {
clearInterval(intervalId)
const result = reduceIssues(issues)
issuesCache = result
resolve(result)
return
}
issues = [...issues, ...result]
offset++
}, interval)
})
}
※key_requestはAPIキーを付与してfetchするメソッド
ざっくり解説
- 単位時間あたりのリクエスト数を減らしたいので、setIntervalを使って一定間隔ごとにリクエストしている
- await すればまるっと結果が入るように、Promiseでラッピング。
- リクエスト結果が!okだったら、最後に到達したということなのでresolveで結果を返す
という感じで、相手側サーバーの負荷をあまり挙げない形で全課題取得が実装できました。
ただ、このコードだと各サイクルで本当に取得が完了しているか?というチェックを全くしていないので、より厳密にやるならもっと別の形で実装する必要があると思います。