在GraphQL中有一些地方需要解析Type
而不仅是Type
中的field
。
后端API -
/users
- 用户列表 - 最小信息 - 名称、ID/users/:id
- 详细用户信息/foo
- 返回一个字段所有者,其为UserID
查询和模式
构建一个模式来执行以下查询
query a {
users {
age # some detail info
}
foo {
owner {
location # some detail info
}
}
}
以下是方案示例 -
type Query {
users: [User]
foo: Foo
}
type Foo {
owner: User
}
type User {
id: ID
age: Int
location: String
}
问题
上述模式中的解析器需要在两个不同的位置包含/处理用户详细信息获取调用。1. 用户列表 - Query.users
和2. Query.foo.owner
。而且必须记住处理这种类型,其中只有用户ID可以将其转换为实际用户。
可能的解决方案
截至本文撰写时,GraphQL支持Interface
和Union
上的resolveType
。无法为整个Type
指定解析器-只有Type
中的field
可以具有解析器。因此,如果可以在GraphQL中解析类型,则会使其更简单实现。
备选解决方案
由于只能解析类型中的字段,因此可以创建一个额外的type
并在解析器中维护对该字段的处理,并位于一个位置。但现在,查询比以前深了1层。
query b {
users {
details {
age
}
}
foo {
owner {
details {
location
}
}
}
}
其他类似的场景
由于GraphQL中无法解析Type
,因此enums
面临相同的问题。当API响应中存在特殊字符并且该字段为ENUM时,您可以在使用此enum的所有位置上记得处理它,或者创建一个额外的类型来表示此enum。
我已经使用ApolloGraphQL为所有这些情况创建了一个最小复制 - https://github.com/boopathi/graphql-test-1
问题
- 架构/语言是否支持指定如何处理特定类型/指定Type的解析器,而不仅仅是Type中的字段?如果不支持,为什么?
- 您如何在架构中处理这些内容?还有其他方法吗?