ThomasReggi ThomasReggi - 4 months ago 35
Node.js Question

How do I access variableValues from GraphQL mutation?

Below I have a

query
requestString
and a
mutation
requestString
.

Both queries are run and I'm logging both of the
resolve
methods.

Questions:


  1. How do I access
    {name: 'Thomas'}
    the
    variableValues
    from the
    resolve
    handler for the
    mutation
    ?

  2. For some reason the second argument passed into the
    resolve
    hander for the mutation is
    require
    itself. Why is that?



Code:

import Promise from 'bluebird'
import axios from 'axios'
import {
graphql,
GraphQLSchema,
GraphQLObjectType,
GraphQLString
} from 'graphql'

var userType = new GraphQLObjectType({
name: 'User',
fields: {
id: { type: GraphQLString },
name: { type: GraphQLString },
}
});

var schema = new GraphQLSchema({
query: new GraphQLObjectType({
name: 'Query',
fields: {
user: {
type: userType,
args: {
id: { type: GraphQLString }
},
resolve: function () {
console.log(arguments)
return Promise.resolve({"name": 'meow'})
}
}
}
}),
mutation: new GraphQLObjectType({
name: 'Mutation',
fields: {
createUser: {
type: userType,
args: {
name: {
name: 'name',
type: GraphQLString
}
},
resolve: () => {
console.log(arguments)
return Promise.resolve({"name": 'meow'})
}
}
}
})
})

var mutationRequest = `
mutation basic($name: String!) {
createUser(name: $name) {
name
}
}
`

graphql(schema, mutationRequest, null, null, {name: 'Thomas'}).then(result => {

console.log(result)

})

var queryRequest = `
query basic($id: String!) {
user(id: $id) {
name
}
}
`

graphql(schema, queryRequest, null, null, {id: '1'}).then(result => {

console.log(result)

})


Results:

thomasreggi@zx:super-octopus$ babel-node graphql-test.js
{ '0': null,
'1': { id: '1' },
'2': null,
'3':
{ fieldName: 'user',
fieldASTs: [ [Object] ],
returnType:
GraphQLObjectType {
name: 'User',
description: undefined,
isTypeOf: undefined,
_typeConfig: [Object],
_interfaces: [],
_fields: [Object] },
parentType:
GraphQLObjectType {
name: 'Query',
description: undefined,
isTypeOf: undefined,
_typeConfig: [Object],
_interfaces: [],
_fields: [Object] },
path: [ 'user' ],
schema:
GraphQLSchema {
_queryType: [Object],
_mutationType: [Object],
_subscriptionType: undefined,
_directives: [Object],
_typeMap: [Object],
_implementations: {} },
fragments: {},
rootValue: null,
operation:
{ kind: 'OperationDefinition',
operation: 'query',
name: [Object],
variableDefinitions: [Object],
directives: [],
selectionSet: [Object],
loc: [Object] },
variableValues: { id: '1' } } }
{ '0': {},
'1':
{ [Function: require]
resolve: [Function: resolve],
main:
Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/thomasreggi/Desktop/super-octopus/graphql-test.js',
loaded: true,
children: [Object],
paths: [Object] },
extensions:
{ '.js': [Function],
'.json': [Function],
'.node': [Function],
'.jsx': [Function],
'.es6': [Function],
'.es': [Function] },
cache: {...requireCache}
}
'2':
Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/thomasreggi/Desktop/super-octopus/graphql-test.js',
loaded: true,
children: [ [Object], [Object], [Object] ],
paths:
[ '/Users/thomasreggi/Desktop/super-octopus/node_modules',
'/Users/thomasreggi/Desktop/node_modules',
'/Users/thomasreggi/node_modules',
'/Users/node_modules' ] },
'3': '/Users/thomasreggi/Desktop/super-octopus/graphql-test.js',
'4': '/Users/thomasreggi/Desktop/super-octopus' }
{ data: { createUser: { name: 'meow' } } }
{ data: { user: { name: 'meow' } } }

Answer

It looks like the Node environment, or your execution context, is providing an arguments object that does not represent the arguments of your resolve method.

If you use named arguments it works just fine:

resolve: function(source, args, context, info) {
  // all arguments have the correct values
}