在Nest GraphQL中如何从Query解析器访问字段嵌套参数
在Nest+Apollo GraphQL中获取嵌套字段参数的问题
核心结论
没办法直接在company根解析器中获取嵌套字段test的val参数——这是由GraphQL的执行流程决定的。
原因说明
GraphQL的执行是分层进行的:
- 先执行根查询
company(id:1),完成getOne解析器的逻辑,返回Company对象; - 再遍历
Company对象的字段,逐个执行对应的解析器(比如test(val:2))。
也就是说,当getOne运行时,嵌套字段test的参数还没被处理,根解析器根本无法感知到这个参数的存在。
可行解决方案
方案1:将val提升为根查询参数(适合val需要影响根ORM查询的场景)
如果val必须参与根查询的where条件,只能修改Schema,把val放到顶层company查询的参数列表中:
修改后的Schema:
type Company { id: Int!, test: Int } type Query { company(id: Int!, val: Int!): Company }
修改后的查询:
query Company { company(id: 1, val: 2) { id test } }
对应的解析器代码:
export class CompaniesResolver { constructor(private companiesService: CompaniesService) {} @Query('company') async getOne( @Args("id") id: number, @Args("val") val: number ): Promise<Hersteller | null> { // 直接将val传入service的ORM查询条件 return await this.companiesService.getOne(id, val); } @ResolveField() async test(@Parent() company: Hersteller) { // 基于根查询返回的company数据计算test值,或直接返回关联字段 return company.testValue; } }
方案2:在test的解析器中处理业务逻辑(适合val仅影响嵌套字段结果的场景)
如果不需要val影响根查询,只是用来计算或过滤test字段的结果,可以把逻辑移到ResolveField中:
@ResolveField() async test( @Parent() company: Hersteller, @Args('val') val: number ) { // 传入company.id和val,调用service做针对性查询 return await this.companiesService.getTestResult(company.id, val); }
补充说明
GraphQL的这种分层设计是为了让每个解析器职责单一:根解析器负责获取顶层对象,嵌套字段解析器负责处理该字段的具体逻辑。强行打破这个流程会导致代码耦合度升高,不符合GraphQL的设计理念。
内容的提问来源于stack exchange,提问作者Jakob Gerstmayer
相关产品推荐
相关产品推荐

