从 graphql 获取解析器级别的请求字段

Posted

技术标签:

【中文标题】从 graphql 获取解析器级别的请求字段【英文标题】:getting requested fields on resolver level from graphql 【发布时间】:2021-05-02 05:31:24 【问题描述】:

来自 graphql 模式的书籍模型

type Book 
  id: ID
  name: String
  pageCount: Int
  author: Author


所以我有这个书的解析器

public class BookResolver implements BookByIdQueryResolver, GraphQLQueryResolver 
    private final MockRepository mockRepository;

    public BookResolver(MockRepository mockRepository) 
        this.mockRepository = mockRepository;
    

    @Override
    public BookTO bookById(String id) 
        return mockRepository.getBookById(id);
    

效果很好。

现在假设我正在使用这个 graphql 查询,它只请求 Book 的一个字段


  bookById(id: "someId") 
    name
  

问题是,如何在 bookById 方法级别获取有关请求字段的信息(在这种情况下只有名称字段)? GraphQLQueryResolver 概念甚至可以实现这一点吗?

dataFetcher 示例

public DataFetcher getBookByIdDataFetcher() 
        return dataFetchingEnvironment -> 
            String bookId = dataFetchingEnvironment.getArgument("id");
            List<SelectedField> requestedFields = dataFetchingEnvironment.getSelectionSet()
                    .getFields()
                    .stream()
                    .collect(Collectors.toList());
            return books
                    .stream()
                    .filter(book -> book.get("id").equals(bookId))
                    .findFirst()
                    .orElse(null);
        ;
    

这很好用,但我对 Resolver 方式很感兴趣。有可能吗?

【问题讨论】:

您能详细解释一下您的要求吗? 添加了更多细节,问题是在解析器中我只获得了我正在寻找这本书的参数信息(在这种情况下为 id)。我想要实现的事情是我希望能够检查查询中请求书中的哪些字段 你检查了吗? ***.com/questions/48004805/… 这是一个 js 解决方案,我正在寻找 java 中的解决方案,并提到了具体的方法 '每个 DataFetcher 都被传递一个 graphql.schema.DataFetchingEnvironment 对象,该对象包含正在获取的字段、已向字段提供的参数以及其他信息,例如字段的父对象、查询根对象或查询上下文对象。' 【参考方案1】:

您可以将 dataFetchingEnvironment 添加为参数,并使用该参数获取请求的字段名称列表。

public BookTO bookById(String id, DataFetchingEnvironment dataFetchingEnvironment) 

    List<SelectedField> requestedFields = dataFetchingEnvironment.getSelectionSet()
                .getFields()
                .stream()
                .collect(Collectors.toList());
    // Use this for your use cases


    return mockRepository.getBookById(id);

需要明确的是,对于您创建并给出查询请求的解析器​​,响应将只有名称,没有其他字段。

【讨论】:

哇,没想到这么简单,去看看 对其进行了测试,运行良好,不知道为什么在我正在寻找的任何解析器示例中都没有提到这一点!

以上是关于从 graphql 获取解析器级别的请求字段的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL:从兄弟解析器访问另一个解析器/字段输出

如何使用 type-graphql 解析器函数获取 graphql 后端中的选定字段?

Apollo GraphQL 服务器:在解析器中,从更高级别获取变量

无法将自定义结果从解析器传递到 Graphql

从字段解析器上的父节点获取数据

具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询