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

参考文献