繁体   English   中英

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

[英]type-graphql: How to know which fields are returned by Resolver

我正在编写一个使用 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 function 中请求了哪些字段的方法。

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

看看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这样的库。 这可以帮助您从解析器 function 的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
  }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM