如何从 GraphQL 突变访问变量值?

How do I access variableValues from GraphQL mutation?

下面我有一个queryrequestString和一个mutationrequestString.

两个查询都是 运行,我正在记录两个 resolve 方法。

问题:

  1. 如何从 mutationresolve 处理程序访问 {name: 'Thomas'} variableValues
  2. 出于某种原因,传递给 resolve 处理程序的第二个参数是 require 本身。这是为什么?

代码:

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)

})

结果:

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

看起来 Node 环境或您的执行上下文正在提供一个 arguments 对象,该对象不代表您的 resolve 方法的参数。

如果你使用命名参数,它工作得很好:

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