【问题标题】:type-graphql: How to know which fields are returned by Resolvertype-graphql:如何知道解析器返回了哪些字段
【发布时间】:2021-04-19 13:13:19
【问题描述】:

我正在编写一个使用 type-graphql 的后端应用程序。 GraphQL 架构包含一个 Folder 类型,如下所示:

type Folder {
  id: ID!
  name: String!
  rules: [Rule!]!
  parent: Group
}

RuleGroup 是其他类型。

我的解析器定义了一个名为 folders 的查询,它返回所有文件夹:

import {Query, Resolver} from 'type-graphql'

@Resolver(() => Folder)
export default class FolderResolver {

  @Query(() => [Folder])
  folders(): Promise<Folder[]> {
    // query db and return results
  }
}

要从数据库中查询文件夹、它们的规则和它们的父组,我必须加入数据库表并返回加入的结果,这没有问题。但是:如果在 GraphQL 查询中没有请求 rules 字段和/或 parent 字段,我可以省略连接并使数据库查询更加高效。因此,在 GraphQL 查询中请求的字段对我需要执行的逻辑有明确的影响,但我看不到在 folders 函数中找出请求的字段的方法。

在执行 type-graphql Resolver 中的查询时,有没有办法确定 GraphQL 查询中请求了哪些字段?

【问题讨论】:

    标签: typescript graphql typegraphql


    【解决方案1】:

    看看Field Resolver。注释是专门为此目的而制作的

    import {Query, Resolver, FieldResolver} from 'type-graphql'
    
    @Resolver(() => Folder)
    export default class FolderResolver {
    
      @FieldResolver()
      rules(@Root() folder: Folder) {
        // ...
      }
    
    
      @FieldResolver()
      parent(@Root() folder: Folder) {
        // ...
      }
    
      @Query(() => [Folder])
      folders(): Promise<Folder[]> {
        // query db and return results
      }
    }
    

    现在,当用户请求查询时没有将 rulesparent 作为其属性的一部分,它们将不会被调用,如果它们中的任何一个或两者都会被调用。您为他们获取数据的逻辑驻留在他们自己的字段解析器中。


    根据评论更新:

    如果你必须得到客户端的字段查询,你可以使用像graphql-fields这样的库。这有助于您从解析器函数的info 参数中提取字段。像这样:(如文档中所述)

      import graphqlFields from 'graphql-fields';
    
      @Query(() => [Folder])
      folders(@Info() info: GraphQLResolveInfo): Promise<Folder[]> {
        // get fields
        const topLevelFields = Object.keys(graphqlFields(info));
        // query db and return results
      }
    

    现在您可以根据请求的字段运行查询。

    【讨论】:

    • 不幸的是,我认为字段解析器在这里没有帮助。如果既不请求 parent 也不请求 rules,我希望 folders 执行仅查询文件夹表的数据库查询。如果请求parent 和/或rules,我希望folders 执行数据库查询,查询文件夹表并加入父表和/或规则表(无论从哪个字段请求,我目前都这样做GraphQL 查询)。无论哪种情况,我都想执行单个数据库查询。我希望我可以在folders 中执行该查询并根据请求的字段对其进行调整。
    • @MatthiasFischer 我已根据您的评论更新了答案。看看吧。
    • 太棒了! @Info 装饰器正是我所缺少的。 graphqlFields 库似乎也非常有用,我会检查一下。非常感谢!
    猜你喜欢
    • 2019-07-25
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多