GraphQLのミューテーションを使う

GraphQLのミューテーションはリソースを変更するものです。

実行順の問題で、argsで渡された引数を元にリソースを変更することは好ましくありません。(詳しくは公式ドキュメントに任せます)

const express = require('express')
const graphqlHTTP = require('express-graphql')
const {
  graphql,
  GraphQLSchema,
  GraphQLObjectType,
  GraphQLList,
  GraphQLString,
  GraphQLInt,
  GraphQLInputObjectType,
  GraphQLNonNull
} = require('graphql');
const atob = require('atob');

const userType = new GraphQLObjectType({
    name: 'user',
    fields: () => ({
      id: { type: GraphQLInt },
      sub: { type: GraphQLString },
      created_at: { type: GraphQLString },
      updated_at: { type: GraphQLString }
    })
  })

function createUser(query) {
  console.log(query)
  return {
    id: 1,
    sub: 'auth0|aaaaaaaaaaaaaaa'
  }
}

const createUserType = new GraphQLObjectType({
  name: 'createUserType',
  fields: {
    sub: { type: new GraphQLNonNull(GraphQLString) }
  }
})

const mutation = new GraphQLObjectType({
  name: 'Mutation',
  fields: {
    createUser: {
      type: createUserType,
      args: { sub: { type: GraphQLString } },
      resolve(obj, { sub }) {
        return createUser(sub);
      }
    }
  }
})

const schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'Query',
    fields: () => ({
      user: {
        type: userType,
        args: {
          sub: { type: GraphQLString }
        },
        resolve: (value, { sub }) => {
          return createUser(sub)
        }
      }
    })
  }),
  mutation: mutation
});

var app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  graphiql: true,
}));
app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));

以下のリクエストを投げたところ、正しく結果が返ってきたことが確認できました。ここでMとfirstは任意の名前です。

mutation M {
  first: createUser(sub: "aaaaa") {
    sub
  }
}

f:id:asmsuechan:20180902173017p:plain