我有一个Apollo GraphQL服务器与API通信,返回大致具有以下结构的响应:
{
"pagination": {
"page": 1,
// more stuff
},
sorting: {
// even more stuff
},
data: [ // Actual data ]
}
这个结构将在这个API的几乎所有响应中共享,我正在广泛使用。 <{1}}大部分时间都是一个数组,但也可以是一个对象。
如何以有效的方式编写此代码,以便我不必在模式中的每个数据类型上重复所有这些data
和pagination
字段?
非常感谢!
答案 0 :(得分:4)
我通过创建名为graphql-s2s的lib来排序您的问题。它通过添加对类型继承,泛型类型和元数据的支持来增强您的模式。在您的情况下,为您的Paginated对象创建泛型类型可能是一个可行的解决方案。这是一个例子:
List[String]
我已经写了关于这个here的更多细节(在第二部分中)。
答案 1 :(得分:2)
定义架构时,最终会将分页,排序等抽象为单独的类型。因此架构看起来像:
type Bar {
pagination: Pagination
sorting: SortingOptions
data: BarData # I'm an object
}
type Foo {
pagination: Pagination
sorting: SortingOptions
data: [FooData] # I'm an array
}
# more types similar to above
type Pagination {
page: Int
# more fields
}
type SortingOptions {
# more fields
}
type BarData {
# more fields
}
所以不会必须多次列出Pagination中的每个字段。但是,使用分页的每种类型仍然需要将其指定为字段 - 没有逃避该要求。
或者,您可以设置一个Type用于所有对象。在这种情况下,数据字段将是一个接口(数据),每个实现它的FooData,BarData等。在Data的解析器中,您将定义__resolveType函数以确定要返回的数据类型。您可以使用查询传入typename变量,然后在__resolveType函数中使用该变量来返回正确的类型。
您可以在Apollo docs中看到一个很好的界面实例。
后一种方法的缺点是你必须返回单个Data对象或它们的数组 - 你不能混合和匹配 - 所以你可能不得不将返回对象的结构更改为让它发挥作用。