You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 23:34:09