在 GraphQL 模式之间共享结构

Ber*_*and 0 relay apollo graphql graphql-js react-apollo

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

{
  "pagination": {
    "page": 1,
    // more stuff
  },
  sorting: {
    // even more stuff
  },
  data: [ // Actual data ]
}
Run Code Online (Sandbox Code Playgroud)

这个结构将在我广泛使用的这个 API 的几乎所有响应中共享。data大多数情况下将是一个数组,但也可以是一个对象。

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

非常感谢!

Nic*_*Dao 5

我通过创建一个名为graphql-s2s的库来对您的问题进行排序。它通过添加对类型继承、泛型类型和元数据的支持来增强您的架构。在您的情况下,为分页对象创建泛型类型可能是一个可行的解决方案。下面是一个例子:

const { transpileSchema } = require('graphql-s2s')
const { makeExecutableSchema } = require('graphql-tools')

const schema = `
type Paged<T> {
    data: [T]
    cursor: ID
}
type Node {
    id: ID!
    creationDate: String
}
type Person inherits Node {
    firstname: String!
    middlename: String
    lastname: String!
    age: Int!
    gender: String 
}
type Teacher inherits Person {
    title: String!
}
type Student inherits Person {
    nickname: String!
    questions: Paged<Question>
}
type Question inherits Node {
    name: String!
    text: String!
}
type Query {

  students: Paged<Student>

  teachers: Paged<Teacher>
}
`

const executableSchema = makeExecutableSchema({
  typeDefs: [transpileSchema(schema)],
  resolvers: resolver
})
Run Code Online (Sandbox Code Playgroud)

我在这里写了更多细节(在第二部分)。