1
1

More than 1 year has passed since last update.

Apollo Server の使い方

Last updated at Posted at 2022-02-20

GraphQL サーバーの Apollo Server の使い方です。
ほぼ、こちらのページの通りです。
Get started with Apollo Server

ファルダーの作成とライブラリーのインストール

mkdir graphql-server-example
cd graphql-server-example
npm init --yes
npm install apollo-server graphql

サーバープログラム

index.js
const { ApolloServer, gql } = require('apollo-server');

// A schema is a collection of type definitions (hence "typeDefs")
// that together define the "shape" of queries that are executed against
// your data.
const typeDefs = gql`
  # Comments in GraphQL strings (such as this one) start with the hash (#) symbol.

  # This "Book" type defines the queryable fields for every book in our data source.
  type Book {
    title: String
    author: String
  }

  # The "Query" type is special: it lists all of the available queries that
  # clients can execute, along with the return type for each. In this
  # case, the "books" query returns an array of zero or more Books (defined above).
  type Query {
    books: [Book]
  }
`;


const books = [
  {
    title: '',
    author: '夏目漱石',
  },
  {
    title: '舞姫',
    author: '森鴎外',
  },
    {
    title: '',
    author: '島崎藤村',
  },
];


// Resolvers define the technique for fetching the types defined in the
// schema. This resolver retrieves books from the "books" array above.
const resolvers = {
  Query: {
    books: () => books,
  },
};

// The ApolloServer constructor requires two parameters: your schema
// definition and your set of resolvers.
const server = new ApolloServer({ typeDefs, resolvers });

// The `listen` method launches a web server.
server.listen().then(({ url }) => {
  console.log(`🚀  Server ready at ${url}`);
});

サーバーの起動

$ node index.js
🚀  Server ready at http://localhost:4000/

クライアントのプログラム

client.sh
curl -X POST \
	-H "Content-Type: application/json" \
	-d '{"query": "{ books {title,author} }"}' \
	http://localhost:4000/ | jq

実行結果

$ ./client.sh 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   178  100   141  100    37   4028   1057 --:--:-- --:--:-- --:--:--  5235
{
  "data": {
    "books": [
      {
        "title": "心",
        "author": "夏目漱石"
      },
      {
        "title": "舞姫",
        "author": "森鴎外"
      },
      {
        "title": "春",
        "author": "島崎藤村"
      }
    ]
  }
}

HTTPie で書いたクライアント

httpie.sh
http POST http://localhost:4000/ query="query { books { title author } }"

実行結果

$ ./httpie.sh 
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Length: 141
Content-Type: application/json; charset=utf-8
Date: Sun, 20 Feb 2022 06:59:42 GMT
ETag: W/"8d-EeJBaKYYZfqDVddcNwDtJvE6zuM"
Keep-Alive: timeout=5

{
    "data": {
        "books": [
            {
                "author": "夏目漱石",
                "title": "心"
            },
            {
                "author": "森鴎外",
                "title": "舞姫"
            },
            {
                "author": "島崎藤村",
                "title": "春"
            }
        ]
    }
}

確認したバージョン

$ node --version
v19.8.1

$ curl --version
curl 8.0.1 (x86_64-pc-linux-gnu) libcurl/8.0.1 OpenSSL/3.0.8 zlib/1.2.13 brotli/1.0.9 zstd/1.5.4 libidn2/2.3.4 libpsl/0.21.2 (+libidn2/2.3.4) libssh2/1.10.0 nghttp2/1.52.0
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd

$ http --version
3.2.1
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1