Mat*_*her 8 typescript graphql typegraphql
我正在编写一个使用 type-graphql 的后端应用程序。GraphQL 架构包含Folder如下所示的类型:
type Folder {
id: ID!
name: String!
rules: [Rule!]!
parent: Group
}
Run Code Online (Sandbox Code Playgroud)
Rule以及Group其他类型。
我的解析器定义了一个名为的查询folders,该查询返回所有文件夹:
import {Query, Resolver} from 'type-graphql'
@Resolver(() => Folder)
export default class FolderResolver {
@Query(() => [Folder])
folders(): Promise<Folder[]> {
// query db and return results
}
}
Run Code Online (Sandbox Code Playgroud)
要从数据库查询文件夹、其规则及其父组,我必须连接数据库表并返回连接结果,这可以正常工作。但是:如果 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
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当用户请求不带属性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
}
Run Code Online (Sandbox Code Playgroud)
现在您可以根据请求的字段运行查询。
| 归档时间: |
|
| 查看次数: |
4313 次 |
| 最近记录: |