GraphQL復習
だいぶ使ってきたけど、改めてデータローダーを中心に調べ直してみる。
/emoji/tea.icon :自分の解釈したポイントのアイコン
改めてAPI用のクエリ言語
本当に独自のデータ構造を返す時に楽
/emoji/tea.icon N+1生みやすい
graphql-ruby
認可
例外処理
code:ruby
def resolve(id:, attributes:)
if post.update(attributes)
{ post: post }
else
raise GraphQL::ExecutionError, post.errors.full_messages.join(", ")
end
end
こんな感じで書くことが多い。一部実装でエラーのステータスコード定義した
current_userの拡張
railsでよく使うこのメソッド、graphql_controllerで拡張できる
複数の認証機構を使っているときとかに便利
jsonを返しているコントローラーが存在している(それはそう)
delete の mutation で何を返却すべきか
id
ステータスコードを独自に定義しても良いかも
GraphQL Code Generator
schemaからTSの型定義作ってくれて便利
N+1
過去の経験
graphql-batchのAssociation Loaderを使用していた
scopeを渡すと、別のハッシュ値が生成されてしまうためキャッシュ機能がうまく使えていなかった
それによってN+1が起きていた(別のものとしてクエリが実行)
Dataloaderの導入
GraphQL実行中のソースインスタンスをキャッシュする
/emoji/tea.icon Loaderのことかな
batchの方はPromise使ってるけど、こっちはFiber使ってる
Sourceクラスはバッチロード処理を記述するために使用される
GraphQL::Dataloader::Sourceを継承してfetchメソッドを実装
GraphQL::Dataloaderはデータが要求されたときにGraphQLの実行を一時停止し、データがフェッチされた後に実行を再開することができます。高レベルでは、GraphQL::DataloaderのFiberの使用方法は次のようになります:
へええ
GoldでFiber resumeとか行ったな
遅延しておいて、データ取得が行われる関数(リゾルバ)が実行されるタイミングでまとめて取得
すぐ取らない