Lighthouse GraphQL自定义解析器报错:Field "address" of type "[Address!]" must have a sub selection问题求助
解决GraphQL + Lighthouse中"Field must have a sub selection"错误
别担心,这个错误和你没使用模型完全没关系!咱们一步步拆解问题:
错误的根本原因
这个报错本质是两个问题导致的:
- GraphQL查询格式不符合要求:当你请求一个对象类型(或者对象数组,比如你的
[Address!])的字段时,GraphQL要求你必须明确指定要返回的子字段,不能只请求这个字段本身。 - 解析器返回的数据不匹配Schema定义:你的
Address类型里lowestId是必填字段(带!),但当前解析器只返回了fullAddress,这会导致后续的验证错误,也是需要修正的点。
具体修复步骤
1. 修正你的GraphQL查询
假设你之前的查询是这样的:
query { address(address: "你的地址参数") }
这完全不符合要求,必须改成指定子字段的形式,比如:
query { address(address: "你的地址参数") { fullAddress lowestId } }
只有明确列出要返回的子字段,GraphQL才知道要给你返回什么数据,这个错误就会先解决一大半。
2. 完善解析器返回的数据
你的Address类型定义里lowestId是必填的,所以解析器必须返回这个字段的值。修改你的PHP解析器代码:
public function resolve($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): array { return array_map( function ($address): array { return [ 'fullAddress' => $address->getFullAddress(), 'lowestId' => $address->getLowestId() // 这里要根据你的service返回的对象,正确获取lowestId的值 ]; }, $this->service->getAddress($args['address']) ); }
确保返回的数组包含Schema中Address类型的所有必填字段,这样数据才能通过GraphQL的验证。
额外说明
Lighthouse完全支持无模型的自定义解析器场景,你用API作为数据源的方案是完全可行的,不用因为没使用模型而担心。只要保证你的解析器返回的数据和Schema定义一致,同时查询时正确指定子字段,这类问题就不会再出现啦。
内容的提问来源于stack exchange,提问作者Ves
相关产品推荐
相关产品推荐

