如何知道在GraphQL查询中请求了哪些字段?

如何知道在GraphQL查询中请求了哪些字段?,graphql,apollo,apollo-server,resolver,Graphql,Apollo,Apollo Server,Resolver,我编写了一个GraphQL查询,如下所示: { posts { author { comments } comments } } 我想知道如何获得posts解析器中请求的子字段的详细信息 我想这样做是为了避免冲突解决程序的嵌套调用。我正在使用ApolloServer的DataSourceAPI 我可以更改API服务器以一次获取所有数据 我使用的是ApolloServer 2.0,任何其他避免嵌套调用的方法都是受欢迎的。这里有几个要点,您可以用来优化查

我编写了一个GraphQL查询,如下所示:

{
  posts {
    author {
      comments
    }
    comments
  }
}
我想知道如何获得
posts
解析器中请求的子字段的详细信息

我想这样做是为了避免冲突解决程序的嵌套调用。我正在使用ApolloServer的
DataSource
API

我可以更改API服务器以一次获取所有数据


我使用的是ApolloServer 2.0,任何其他避免嵌套调用的方法都是受欢迎的。

这里有几个要点,您可以用来优化查询以提高性能

  • 在您的示例中,可以使用 . 如果您将注释加载到 通过数据加载器,您将确保调用这些解析器 就一次。这将减少对数据库的调用数量 重要的是,正如您的查询中显示的N+1问题
  • 我不知道你需要在帖子中获得什么样的确切信息 提前,但如果你知道后ID,你可以考虑做一个 通过将已知ID传递到注释中来“向前看”。这将 确保您不需要等待帖子,您将避免 graphql树调用,您可以在不使用 等待发帖。这是优化GraphQL的好文章 瀑布式的请求,您可能会给出一个好主意,如何优化您的 使用数据加载器进行查询并进行前瞻

  • 这里有两个要点,可用于优化查询以提高性能

  • 在您的示例中,可以使用 . 如果您将注释加载到 通过数据加载器,您将确保调用这些解析器 就一次。这将减少对数据库的调用数量 重要的是,正如您的查询中显示的N+1问题
  • 我不知道你需要在帖子中获得什么样的确切信息 提前,但如果你知道后ID,你可以考虑做一个 通过将已知ID传递到注释中来“向前看”。这将 确保您不需要等待帖子,您将避免 graphql树调用,您可以在不使用 等待发帖。这是优化GraphQL的好文章 瀑布式的请求,您可能会给出一个好主意,如何优化您的 使用数据加载器进行查询并进行前瞻

  • 您需要解析作为第四个参数传递给解析器的
    info
    对象。这是对象的类型:

    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 },
    }
    
    这将沿以下几行记录对象:

    {
      alias: 'posts',
      name: 'posts',
      args: {},
      fieldsByTypeName: {
        Post: {
          author: {
            alias: 'author',
            name: 'author',
            args: {},
            fieldsByTypeName: ...
          }
          comments: {
            alias: 'comments',
            name: 'comments',
            args: {},
            fieldsByTypeName: ...
          }
        }
      }
    }
    

    您可以遍历结果对象并相应地构造SQL查询(或一组API请求,或其他任何内容)。

    您需要解析作为第四个参数传递给解析程序的
    info
    对象。这是对象的类型:

    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 },
    }
    
    这将沿以下几行记录对象:

    {
      alias: 'posts',
      name: 'posts',
      args: {},
      fieldsByTypeName: {
        Post: {
          author: {
            alias: 'author',
            name: 'author',
            args: {},
            fieldsByTypeName: ...
          }
          comments: {
            alias: 'comments',
            name: 'comments',
            args: {},
            fieldsByTypeName: ...
          }
        }
      }
    }
    

    您可以遍历结果对象并构造SQL查询(或一组API请求,或其他任何内容)因此。

    这正是我所要找的。的作者还建议使用
    graphql parse resolve info
    继续前进。这正是我所要找的。的作者还建议使用
    graphql parse resolve info
    继续前进。这基本上是一个重复,这基本上是一个重复属于