GraphQL
クライアントが必要なフィールドだけを問い合わせるAPIクエリ言語。_moc-web-infra
特徴
- 1つのエンドポイントでスキーマ駆動。over-fetching/under-fetching を避ける。CQRS の参照系と親和的。
- ページングは Cursor Connections 仕様(Relay)。
- 落とし穴: クエリ引数で配列を渡す際、テンプレート文字列に配列をそのまま展開すると
"apple,grape"になってしまうので["apple","grape"]形式に整形する。
RDBアダプタ / サーバ
- Prisma: node.js界のActiveRecord的ORM。スキーマからクライアント生成。
- Hasura: RDBに GraphQL API を生やすサーバ。Hasura Cloud は個人開発に安価。「EasyのHasura、SimpleのPrisma」。
対比
- tRPC: RESTfulでGraphQLのように必要フィールドだけフェッチ。サーバ側で zod によりインターフェース定義、型がe2eで通る。
- grpc: バイナリ・契約駆動のRPC。
関連
原典メモ(notes/GraphQL より統合)
GraphQL
GraphQLのクエリの引数で配列を使いたい時
スキーマ
query {
harvest(fruits: [String!]!): Bool!
}呼び出し
const fruits = ['apple', 'grape']
callAPI(`query {
harvest(fruits: ${fruits})
}`)こう書いてしまうとテンプレート文字列のなかの ${fruits} は "apple,grape" と展開され配列にならないので、
正しい呼び出し
const fruits = ['apple', 'grape']
const arrayToString = array => array.map(e => `"${e}"`).join(',')
callAPI(`query {
harvest(fruits: [${arrayToString(fruits)}])
}`)のように変換をかけてあげて '["apple", "grape"]' のような形式になるようにしましょう。 少し嵌った。
RDBアダプタ
EasyのHasura、SimpleのPrisma
参考文献
- CI で楽して継続的に更新する GraphQL API ドキュメント
- ぼくのかんがえたさいきょうの個人開発あーきてくちゃ
- Hasura cloud個人開発として最強かも
- (わりと)任意の Mac Application に GraphQL でアクセスできるようにした
- GraphQL Cursor Connections Specification
- GraphQL の pagination の仕様
2022-04-25
- GraphQL の pagination の仕様
- GraphQL Cursor Connections Specification
- ひさしぶりに「データ指向アプリケーションデザイン」を読んだ - Write and Run
- 分散システムの良書らしい
- データ指向アプリケーションデザインから見るGraphQL