apollographql のチュートリアル通りに作る
https://www.apollographql.com/docs/apollo-server/getting-started/#step-1-create-a-new-project
ディレクトリの作成と npm init
mkdir ~/source/gq2
cd ~/source/gq2
npm init --yes
ディレクトリを作成して npm を初期化する
"name": "gq2",
"version": "1.0.0",
"description": "",
"main": "index.js",
今回は private: true も type:module も入らなかった。
apollo-server と grapql の インストール
npm install apollo-server graphql
apollo-server と graphql をプロジェクトに入れる。
index.js で使うライブラリを apollo-server から require して、型定義を gql で typeDefs として作る。
const { ApolloServer, gql } = require('apollo-server');
const typeDefs = gql`
type Book {
title: "String"
author: String
}
type Query {
books: [Book]
}
`;
require を使って apollo-server から gql たちを import する
typeDefs に型定義として gql を使ってまずは必須の Root である Query
そこに title と author をもつ Book を結びつける。
index.js に実データのオブジェクトの配列の books を作る
const books = [
{
title: 'The Awakening',
author: 'Kate Chopin',
},
{
title: 'City of Glass',
author: 'Paul Auster',
},
];
実データのオブジェクトの配列を作る。
index.js に query のリクエストが来た時の対応の resolvers を書く。
const resolvers = {
Query: {
books: () => books,
},
};
リゾルバとして、books のクエリが来た時に books のオブジェクトを返すように組む。
ApolloServer を使って型定義とリゾルバをまとめ、csrf 防止と Cache Bounded をつける。
const server = new ApolloServer({
typeDefs,
resolvers,
csrfPrevention: true,
cache: 'bounded',
});
型定義とリゾルバをまとめ、csrf 防止と Cache Bounded をつける。
listen でサーバーを起動して、.then で起動後に url を読み取って console に出力する
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
これでサーバーを起動できる。
listen の中身では、普通に express の http server のスタートなどが組まれている。
実際に走らせて、ブラウザで確認する
node index.js
🚀 Server ready at http://localhost:4000/
開いているのを確認。
books の title だけをリクエストすると
2 つのデータのタイトルのみが
author もリクエストにつけると、
2 つのデータのタイトルも著者も
レスポンスとして返ってくるのが確認できた。
curl --request POST \
> --header 'content-type: application/json' \
> --url http://localhost:4000/ \
> --data '{"query":"query ExampleQuery { books { title, author }}"}'
{"data":{"books":[{"title":"The Awakening","author":"Kate Chopin"},{"title":"City of Glass","author":"Paul Auster"}]}}
curl で POST リクエストをしても
中身が返ってくるのを確認できた。
Top comments (0)