Lighthouse graphql 自定义解析器

Lighthouse graphql custom resolver

对 GraphQL 和 lighthouse 库比较陌生,不要太苛刻。

因为我不能使用任何模型,因为我的数据源是 API。我正在尝试创建一个自定义解析器,它将数据传递给一个服务,该服务将做一切必要的事情来从 API.

检索数据

它不断地 returns 我这个错误:"Field \"address\" of type \"[Address!]\" must have a sub selection.", 我相信这是因为我不使用模型(只是一个疯狂的猜测)

到目前为止,我的架构如下所示:

type Query {
    address(address: String!): [Address!] @field(resolver: "Address@resolve")
}

type Address {
    fullAddress: String!
    lowestId: Int!
}

以及提到的解析器:

    public function resolve($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): array
    {
        return array_map(
            function ($address): array {
                return [
                    'fullAddress' => $address->getFullAddress()
                ];
            },
            $this->service->getAddress($args['address'])
        );
    }

提前致谢!

该错误甚至不是 Lighthouse 特有的,任何 GraphQL 服务器都会针对您尝试执行的操作产生类似的错误。我假设您正在尝试这样的查询:

{
  address(address: "foo")
}

考虑 GraphQL 中的 graph:你的服务器描述了可用的数据类型和它们之间的关系,形成了一个图。每种类型都可以有指向另一种类型的字段,然后该类型指向另一种类型,依此类推。这些引用甚至可以形成循环。在某些点,图可能会结束:标量值等类型标记图的叶子。

现在,服务器如何知道您想要查看图形的哪一部分并且应该解析它?通过查询:对该图的一部分进行子选择。这自然会限制服务器必须达到的深度,它可以对 return 您查询的图表部分进行最少的工作。

一条查询规则是您必须始终以叶节点结束。这是错误消息发挥作用的地方:服务器发现 Address 不是叶类型,因此要求您指定要遍历图形的深度。一个有效的查询可以是:

{
  address(address: "foo") {
    fullAddress
  }
}