如何在GraphQL解析器中获取请求的字段?

ars*_*lan 7 graphql graphql-js

我正在使用graphql-tools。收到GraphQL查询后,我使用ElasticSearch执行搜索并返回数据。

但是,通常所请求的查询仅包括一些可能的字段,而不是全部。我只想将请求的字段传递给ElasticSearch。首先,我需要获取请求的字段。

我已经可以将整个查询作为字符串获取。例如,在解析器中,

const resolvers = {
  Query: {
    async user(p, args, context) {
      //can print  query as following
      console.log(context.query)                
    }
    .....
  }
}
Run Code Online (Sandbox Code Playgroud)

它打印为

query User { user(id:"111") { id  name address } }
Run Code Online (Sandbox Code Playgroud)

有没有办法以以下格式获取请求的字段

{ id:"",  name:"", address:"" }
Run Code Online (Sandbox Code Playgroud)

Her*_*rku 9

在graphql-js中,解析器提供了第四个参数称为resolve info。该字段包含有关该字段的更多信息。

GraphQL docs GraphQLObjectType config参数类型定义:

// See below about resolver functions.
type GraphQLFieldResolveFn = (
  source?: any,
  args?: {[argName: string]: any},
  context?: any,
  info?: GraphQLResolveInfo
) => any

type GraphQLResolveInfo = {
  fieldName: string,
  fieldNodes: Array<Field>,
  returnType: GraphQLOutputType,
  parentType: GraphQLCompositeType,
  schema: GraphQLSchema,
  fragments: { [fragmentName: string]: FragmentDefinition },
  rootValue: any,
  operation: OperationDefinition,
  variableValues: { [variableName: string]: any },
}
Run Code Online (Sandbox Code Playgroud)

在该fieldNodes字段中,您可以搜索您的字段并获取selectionSet特定字段的。从这里开始,它变得很棘手,因为selections可以是常规字段选择,片段或内联片段。您必须将所有这些合并,才能知道在一个字段上选择的所有字段。


s.m*_*jer 6

info在解析器中有一个作为第4个参数传递的对象。此参数包含您要查找的信息。

使用库graphql-fields可以帮助您解析graphql查询数据:

const graphqlFields = require('graphql-fields');

const resolvers = {
  Query: {
    async user(_, args, context, info) {
      const topLevelFields = graphqlFields(info);
      console.log(Object.keys(topLevelFields)); // ['id', 'name', 'address']
    },
};
Run Code Online (Sandbox Code Playgroud)

  • 请注意,[graphql-fields](https://github.com/robrichard/graphql-fields/issues/27#issuecomment-577412938) 的作者建议继续使用“graphql-parse-resolve-info”。 (5认同)