type-graphql:如何知道解析器返回了哪些字段



我正在编写一个使用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 解析器中的查询时,有没有办法确定 GraphQL 查询中请求了哪些字段?

看看字段解析器。注释是专门为此目的而制作的

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
}

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

最新更新