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 } }