Apollo Serverを使用してGraphQLサーバを起動する – 【GraphQL】
GraphQLサーバを起動します。Apollo Serverを使用します。
プロジェクト作成とインストール
$ npm init -y $ npm i @apollo/server graphql $ touch server.mjs
v3とv4
apollo-serverはv3、@apollo/serverはv4のようです。
package.json
package.jsonのnpmスクリプトを以下にします。
"scripts": { "start": "node server.mjs" }
server.mjs
server.mjsの中身です。
server.mjs
import { ApolloServer } from '@apollo/server'; import { startStandaloneServer } from '@apollo/server/standalone'; // schema const typeDefs = `#graphql type Query{ hi: String hello(name: String!): String bye(name: String!, message: String!): String } ` // resolver const resolvers = { Query: { hi: () => {return 'hi.'}, hello: (p, a) => { return 'Hello World ' + a.name }, bye: (p, a)=> a.message + ' ' + a.name } } const server = new ApolloServer({ typeDefs, resolvers }); const { url } = await startStandaloneServer(server); console.log(`🚀 Server ready at ${url}`);
起動
npm run start
でサーバ起動ができます。
http://localhost:4000/にアクセスします。
GraphQLのplaygroundにアクセスできます。この画面からhelloクエリを実行します。
helloクエリ
Qurery
query ExampleQuery($name: String!) { hello(name: $name) }
Variables
{ "name": "takahashi" }
Response
{ "data": { "hello": "Hello World takahashi" } }
上記がブラウザでhelloクエリを実行したレスポンス結果です。
byeクエリ
次にbyeクエリを実行します。
Qurery
query Query($name: String!, $message: String!) { bye(name: $name, message: $message) }
Variables
{ "name": "takahashi", "message": "byebye" }
Response
{ "data": { "bye": "byebye takahashi" } }
上記がブラウザでbyeクエリを実行したレスポンス結果です。
スキーマの種類
スキーマにはQuery、Mutation、Subscription、それと任意の名前のオブジェクトと言うスキーマが定義できます。
Query、Mutation、Subscriptionの3つは予め定義された特別なスキーマです。
フロントからfetchでデータ取得する
htmlファイルを作成してfetchして確認します。
test.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>test</title> </head> <script> async function load() { const response = await fetch("http://localhost:4000", { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify({ query: `query($name: String!, $message: String!) { bye(name: $name, message: $message) }`, variables: {"name": "takahashi", "message": "bybybybyby"} }) }); const data = await response.json(); document.getElementById('app').innerHTML = `${data.data.bye}`; } load(); </script> <body> <div id="app"></div> </body> </html>
ブラウザで開くと、byeクエリが実行されています。
curlコマンド
curlコマンドでPOSTしても確認できます。hiクエリを実行する例です。
C:\>curl -X POST -H "Content-Type: application/json" ^ -d "{\"query\": \"{ hi }\"}" http://localhost:4000/
引数有になってくるとcurlは面倒なのでPOSTMANなどのツールでテストする方がよさそうです。
ドキュメント
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント