GraphQL + Apollo Server

ライブラリインストール

npm i apollo-server@2.19.0 graphql@15.4.0

# apollo-server は 3系が出てたけど、subscriptionの書き方が変わっていたのであきらめた。

スキーマ

const {gql} = require('apollo-server');

const typeDefs = gql`
type Query {
  posts(kw: String): [Post!]!
}

type Mutation {
  createPost(data: CreatePostInput!): Post!
  deletePost(id: ID!): Post!
  updatePost(id: ID!, data: UpdatePostInput!): Post!
}

# サブスクリプション
type Subscription {
  post: PostSubscriptionPayload!
}

input CreatePostInput {
  title: String!
  message: String!
}

input UpdatePostInput {
  title: String
  message: String!
}

type Post {
  id: ID!
  title: String!
  message: String!
}

enum MutationType {
  CREATED
  UPDATED
  DELETED
}

# サブスクリプションのフィールド
type PostSubscriptionPayload {
  mutation: MutationType!
  data: Post!
}
`

gql `… はタグ付きテンプレートリテラルって書き方みたい

Apollo server 起動

const {ApolloServer,PubSub} = require('apollo-server');
const db = require('./db')
const typeDefs = require('./schema')

//PubSubのインスタンスを作成
const pubsub = new PubSub()

const server = new ApolloServer({
    typeDefs,
    resolvers: {
        Query: {
          posts(parent, args, {db}, info){
            // 処理
            // args で引数が渡される
          },
        },
        Mutation:{
          createPost(parent, args, { db, pubsub }, info) {
            // 処理
            // pubsub に情報を渡す
            pubsub.publish('post', {
              post: {
                mutation: 'CREATED',
                data: /* 更新後のデータを渡す */
              }
            }
          }
          updatePost(parent, args, { db, pubsub }, info) {
            // 処理
            // pubsub に情報を渡す
            pubsub.publish('post', {
              post: {
                mutation: 'UPDATED',
                data: /* 更新後のデータを渡す */
              }
            }
        },
        Subscription:{
          post: {
            subscribe(parent, args, { pubsub }, info) {
              return pubsub.asyncIterator('post') // publish 時に指定したトピック名
            }
          }
        }
    },
    context: {
        db,
        pubsub
    }
})

server.listen().then(({ url, subscriptionsUrl }) => {
    console.log(`Server ready at ${url}`);
    console.log(`Subscriptions ready at ${subscriptionsUrl}`);
  });

たたきかた

# 取得:パラメータなし
query{
  posts{
    id
    title
    message
  }
}

# 取得:パラメータあり
query{
  posts(kw:"舞"){
    id
    title
    message
  }
}

# 新規登録
mutation{
  createPost(data:{
    title:"タイトルです"
    message:"本文です"
  }){
    id
    title
    message
  }
}

# 更新登録
mutation{
  updatePost(
    id:"4"
    data:{
      title:"タイトル更新"
      message:"本文です更新"
  }){
    id
    title
    message
  }
}

#subscription
subscription{
  post{
    mutation
    data{
      id
      title
      message
    }
  }
}