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
}
Rule
和Group
是其他类型。
我的解析器定义了一个名为 folders
的查询,其中 return 所有文件夹:
import {Query, Resolver} from 'type-graphql'
@Resolver(() => Folder)
export default class FolderResolver {
@Query(() => [Folder])
folders(): Promise<Folder[]> {
// query db and return results
}
}
要从数据库查询文件夹、它们的规则和它们的父组,我必须连接数据库表和 return 连接结果,这没有问题。但是:如果在 GraphQL 查询中没有请求 rules
字段和/或 parent
字段,我可以省略连接并使数据库查询更加高效。所以在 GraphQL 查询中请求的字段对我需要执行的逻辑有一定的影响,但我没有看到在 folders
函数中找出请求了哪些字段的方法。
执行 type-graphql 解析器中的查询时,有没有办法确定在 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
}
}
现在,当用户请求的查询没有 rules
或 parent
作为其属性的一部分时,将不会调用它们,如果它们中的一个或两个都被调用。您为他们获取数据的逻辑驻留在他们自己的字段解析器中。
根据评论更新:
如果您必须通过客户端获取字段查询,您可以使用像 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
}
现在您可以运行根据请求的字段进行查询。
我正在编写一个使用 type-graphql 的后端应用程序。 GraphQL 模式包含一个 Folder
类型,如下所示:
type Folder {
id: ID!
name: String!
rules: [Rule!]!
parent: Group
}
Rule
和Group
是其他类型。
我的解析器定义了一个名为 folders
的查询,其中 return 所有文件夹:
import {Query, Resolver} from 'type-graphql'
@Resolver(() => Folder)
export default class FolderResolver {
@Query(() => [Folder])
folders(): Promise<Folder[]> {
// query db and return results
}
}
要从数据库查询文件夹、它们的规则和它们的父组,我必须连接数据库表和 return 连接结果,这没有问题。但是:如果在 GraphQL 查询中没有请求 rules
字段和/或 parent
字段,我可以省略连接并使数据库查询更加高效。所以在 GraphQL 查询中请求的字段对我需要执行的逻辑有一定的影响,但我没有看到在 folders
函数中找出请求了哪些字段的方法。
执行 type-graphql 解析器中的查询时,有没有办法确定在 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
}
}
现在,当用户请求的查询没有 rules
或 parent
作为其属性的一部分时,将不会调用它们,如果它们中的一个或两个都被调用。您为他们获取数据的逻辑驻留在他们自己的字段解析器中。
根据评论更新:
如果您必须通过客户端获取字段查询,您可以使用像 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
}
现在您可以运行根据请求的字段进行查询。