type-graphql:如何知道Resolver返回了哪些字段

2024-05-15

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

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

Rule and Group是其他类型。

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

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

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

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

要从数据库查询文件夹、其规则及其父组,我必须连接数据库表并返回连接结果,这可以正常工作。但是:如果rules字段和/或parentGraphQL 查询中未请求字段,我可以省略联接并使数据库查询更加高效。因此,GraphQL 查询中请求的字段对我需要执行的逻辑有明确的影响,但我没有找到一种方法来找出在 GraphQL 查询中请求了哪些字段。folders功能。

当执行 type-graphql 解析器中的查询时,是否有办法确定 GraphQL 查询中请求了哪些字段?


看一下现场解算器 https://typegraphql.com/docs/0.17.0/resolvers.html#field-resolvers。该注释是专门为此目的而制作的

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

现在,当用户请求查询时,无需rules or parent作为其属性的一部分,它们不会被调用,如果它们之一或两者都将被调用。您为它们获取数据的逻辑驻留在它们自己的字段解析器中。


根据评论更新:

如果您必须获取客户端的字段查询,您可以使用类似的库graphql 字段 https://github.com/robrichard/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
  }

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

type-graphql:如何知道Resolver返回了哪些字段 的相关文章

随机推荐