在GraphQL架构之间共享结构

时间:2017-07-03 09:57:47

标签: graphql relay graphql-js apollo react-apollo

我有一个Apollo GraphQL服务器与API通信,返回大致具有以下结构的响应:

{
  "pagination": {
    "page": 1,
    // more stuff
  },
  sorting: {
    // even more stuff
  },
  data: [ // Actual data ]
}

这个结构将在这个API的几乎所有响应中共享,我正在广泛使用。 <{1}}大部分时间都是一个数组,但也可以是一个对象。

如何以有效的方式编写此代码,以便我不必在模式中的每个数据类型上重复所有这些datapagination字段?

非常感谢!

2 个答案:

答案 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对象或它们的数组 - 你不能混合和匹配 - 所以你可能不得不将返回对象的结构更改为让它发挥作用。