【发布时间】:2021-07-28 21:00:05
【问题描述】:
目标是使用 NestJS 以代码优先的方式实现 GraphQL 架构。
假设我的 GraphQL 架构中有一个 Pet 类型,其中包含两个字段 name 和 age。如果这两条信息来自不同的事实来源(而且我并不总是想同时获取两者),我可以为每个字段实现一个带有解析器的 PetResolver 类:
@Resolver(() => Pet)
export class PetResolver {
@Query(() => Pet)
pet(): Pet {
return {};
}
@ResolveField()
name(): Promise<string> {
return Promise.resolve('Spot');
}
@ResolveField(() => Int)
age(): Promise<number> {
return Promise.resolve(2);
}
}
可以这样使用:
query GetPet {
pet {
name
}
}
这样可以确保每个字段的值仅在请求时才被获取,但是如果我想在我的 User 类型上拥有一个 pet 字段,我可以像这样查询:
query GetUserWithPet {
currentUser {
email
pet {
name
}
}
}
应用同样的原理,我可以像这样创建一个 UserResolver 类:
@Resolver(() => User)
export class UserResolver {
@Query(() => User)
@UseGuards(AuthCognitoGuard)
currentUser(@CurrentUser() user: IdTokenPayload): User {
return {
id: user.sub,
email: user.email,
};
}
@ResolveField()
pet(@Parent() user: User): Promise<Pet> {
return petService.getPetForUserId(user.id);
}
}
但是PetService 实现如果只想获取相关数据,则必须知道请求了哪些字段。
A) 有没有办法在 UserResolver 中使用 PetResolver 来利用单个字段解析逻辑?
B) 如果不是,那么使用 NestJS 代码优先约定确定查询中请求哪些字段的最佳方法是什么?
C) 这是思考 GraphQL 查询的“错误”方式吗?最佳实践是否要求我保留单独的解析器并使用如下查询:
query GetUserWithPet {
currentUser {
email
}
pet {
name
}
}
【问题讨论】:
标签: graphql nestjs code-first