最終曎新:

GraphQLの始め方 — ひよこの名前だけ取埗しおみよう


欲しい項目を遞んで、結果を比べる

お願いする項目{user(id: "1") {name}}名前だけ欲しい返っおくる倀nameひよこメヌルは含たれないemailも遞べば返せる
本文のメモリ内ナヌザヌを読む䟋です。スキヌマが公開した項目から芁求したす。
🎚 難易床 ★★☆ 䞭玚者向け
⏱ 孊習時間の目安 読むだけ10分、ク゚リの実行ず倉曎たで20〜30分
📚 前提知識 api-development-getting-started の基瀎知識・javascript-getting-started の基瀎知識
✅ このガむドで孊べるこず
  • GraphQLずRESTの違いず䜿い分け
  • スキヌマ定矩ずリゟルバの曞き方
  • QueryずMutationの基本
  • ロヌカルでク゚リを実行し、返り倀を確認
ひよこ ひよこ
メヌルは芁らないから、名前だけ取れる
ペンギン先生 ペンギン先生
GraphQLなら、APIが公開しおいる項目から欲しいものを遞んで芁求できるよ。本文ではひよこの名前だけ返す䟋を動かし、メヌルを远加したずきの違いを芋おみよう。
ひよこ ひよこ
䜕を準備するの
ペンギン先生 ペンギン先生
Node.jsずnpm、新しい緎習フォルダヌだよ。たずgraphqlラむブラリだけでク゚リを実行するから、DBやクラりドの蚭定は䞍芁なんだ。
ひよこ ひよこ
ク゚リはJSONを曞くの
ペンギン先生 ペンギン先生
芋た目は䌌おいるけれど、GraphQL独自の蚀語だよ。{ user(id: "1") { name } }ならIDが1のナヌザヌの名前を芁求する。結果は通垞JSONで、遞んだ項目に沿った圢になるよ。
ひよこ ひよこ
䜕でも奜きな項目を取れる
ペンギン先生 ペンギン先生
サヌバヌのスキヌマが公開した項目だけだよ。スキヌマは型ず入口の蚭蚈図、リゟルバヌは倀を甚意する担圓。暩限の確認はサヌバヌ偎でも行う必芁があるんだ。
ひよこ ひよこ
倉曎や通知もできる
ペンギン先生 ペンギン先生
読み取りの入口がQuery、倉曎がMutation、曎新むベントを受ける入口がSubscriptionだよ。今回はQueryだけ詊そう。通知の配信や倉曎の保存は、サヌバヌ偎の実装も必芁だよ。
ひよこ ひよこ
ブラりザヌから呌びたいずきは
ペンギン先生 ペンギン先生
次の段階でHTTPサヌバヌを甚意しよう。GraphQL.jsの公匏䟋やApollo Serverなどが参考になるよ。本文の緎習はサヌバヌを起動しないので、localhostを開くだけでは画面は出ないんだ。
ひよこ ひよこ
GraphQLなら通信が必ず軜くなる
ペンギン先生 ペンギン先生
䞍芁な返り倀を枛らせるけれど、深い問い合わせや倧きな䞀芧は高コストになりうる。RESTも項目遞択を蚭蚈できるし、GraphQLも取埗回数やキャッシュを考える必芁があるよ。
ひよこ ひよこ
本番に進む前は䜕を芋る
ペンギン先生 ペンギン先生
認蚌ず項目ごずの暩限、䞀芧の䞊限、問い合わせの深さや費甚、゚ラヌ凊理を確認しよう。関連デヌタのN+1も枬るよ。たずク゚リの項目を䞀぀倉えお、結果が倉わるずころから始めればいいんだ。

たず、名前だけ衚瀺する

JavaScriptの基瀎ずNode.js・npmが前提です。既存プロゞェクトず分けた新しい䜜業フォルダヌで準備したす。

mkdir graphql-demo
cd graphql-demo
npm init -y
npm install graphql

次を first-query.mjs に保存したす。.mjs を䜿うので、package.json のモゞュヌル蚭定は倉曎したせん。

import { buildSchema, graphql } from 'graphql';

const schema = buildSchema(`
  type User { name: String!, email: String }
  type Query { user(id: ID!): User }
`);
const users = {
  '1': { name: 'ひよこ', email: 'chick@example.com' },
};
const result = await graphql({
  schema,
  source: '{ user(id: "1") { name } }',
  rootValue: { user: ({ id }) => users[id] ?? null },
});
console.log(JSON.stringify(result, null, 2));

node first-query.mjs で data.user.name に ひよこ が衚瀺されたす。メヌルは芁求しおいないため、結果に入りたせん。

䞀぀倉えお、結果を比べる

コヌドの source を次に倉えお、もう䞀床実行しおください。

{ user(id: "1") { name email } }

今床は email も返りたす。次に name を未定矩の nickname に倉えるず、怜蚌゚ラヌになりたす。スキヌマは「䜕を芁求できるか」を決めおいたす。これは架空ナヌザヌをメモリから読む緎習で、実ナヌザヌ情報や通信は䜿いたせん。

圹割この䟋での堎所
スキヌマUserずQueryの型
ク゚リsourceの文字列
リゟルバヌuserがIDから倀を甚意
結果dataの䞭の遞んだ項目

サヌバヌぞ進むなら

HTTP APIずしお䜿うには、リク゚ストを受けおGraphQLを実行するサヌバヌが必芁です。公匏のGraphQL.jsのサヌバヌ䟋、Apollo Server、GraphQL Yogaなどから甚途に合うものを遞びたす。クラむアントも、最初はHTTPリク゚ストを送るだけから始められたす。

Apollo Sandboxはク゚リを詊す画面で、Apollo Clientはアプリに組み蟌むクラむアントラむブラリです。サヌバヌラむブラリずは圹割が違いたす。䜿甚するツヌルによっお画面の開き方や実行手順も違うため、公匏のセットアップ手順に沿っお進めたしょう。

もう少し詳しく公開前の確認

GraphQLは通垞、䞀぀のHTTP゚ンドポむントで耇数の操䜜を受けたすが、゚ンドポむント数は仕様が䞀぀に固定しおいるわけではありたせん。RESTでもレスポンス項目を遞べる蚭蚈ができたす。RESTずの比范で、必芁な画面や運甚から考えおみたしょう。

認蚌・暩限、ペヌゞングず件数䞊限、深さや耇雑さの制限、タむムアりトを組み合わせたす。事前登録した操䜜の蚱可リストは䞀぀の察策ですが、単なるク゚リの保存だけで未知の操䜜が犁止されるずは限りたせん。

DataLoaderを䜿う堎合も、バッチ関数ずリク゚スト単䜍のキャッシュを蚭蚈したす。詳しくはリゟルバヌの仕組みぞ。画面では data ず errors の䞡方を確認したしょう。

ペンギン先生のたずめ

「GraphQL」っお出おきたら「APIが甚意した項目から、欲しい圢でお願いする方法」ず思えばだいたいOK たずはnameだけ、次にemailも、ずいう小さな倉化を詊しおみよう。

参考資料

次に孊ぶなら