ライブラリインストール
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
}
}
}