javascript - 将上下文信息绑定(bind)到 GraphQL 类型中?

标签 javascript graphql graphql-js

假设我有两种 GraphQL 类型:

type Student {
  id: ID!
  name: String!
}

type Classroom {
  id: ID!
  students: [Student!]!
}

type Query {
  classroom(id: ID!): Classroom!
}

然后我可以像这样运行查询:

{
  classroom(id: 1) {
    id
    students {
      id
      name
    }
  }
}

设置正确的解析器后,这将返回与特定教室关联的学生。

但是,假设我想查找一些与学生在类里面的表现有关的信息,假设:

averageTestScore: Int!
numAbsences: Int!

我认为我需要一个包装类型,例如:

type ClassroomStudent {
  averageTestScore: Int!
  numAbsences: Int!
  student: Student!
}

我想知道是否有标准化的方法来做到这一点?此外,我有许多现有查询将 Classroom 直接绑定(bind)到 Student,因此引入 ClassroomStudent 将是一项重大 API 更改。有没有一种方法可以让我构建我的 API,以允许这些类型的更改非常有机地引入,而不会引入向后不兼容的更改?

感谢您的宝贵时间。

最佳答案

符合中继的架构中的常见模式是将此类字段附加到相关边缘:

type StudentConnection {
  pageInfo: PageInfo
  edges: [StudentEdge!]!
}

type StudentEdge {
  cursor: String!
  node: Student!
  averageTestScore: Int!
  numAbsences: Int!
}

type Classroom {
  students: StudentConnection!
  # other fields
}

但是,这实际上仍然与引入您提议的 ClassroomStudent 相同。无论哪种方式,在不破坏 API 的情况下引入此类更改的技巧是保留(并弃用)前一个字段并以不同的名称引入新字段:

type Classroom {
  students: [Student!]! @deprecated(reason: "Use classroomStudents instead")
  classroomStudents: [ClassroomStudent!]!
  # other fields
}

它可能看起来不太漂亮,但它可以让您的客户端应用程序进行转换,而无需处理重大更改。

另一个潜在的选择:

type Student {
  performance(classroom: ID!): StudentPerformance
}

您可以向学生添加一个字段,其中包含所需的类参数。如果查询有学生的特定教室,这会迫使客户端可能两次提供相同的教室 ID,但这是一个有效的选项。它还具有允许您直接查询学生而不必获取类数据的额外好处:

query {
  students {
    id
    performance(classroom: 1) {
      averageTestScore
      numAbsences
    }
  }
}

关于javascript - 将上下文信息绑定(bind)到 GraphQL 类型中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54778376/

相关文章:

node.js - 可以对 type-graphql 中的结果列表元素进行计数

javascript - 如何为 GraphQL 服务器设计以下解析器?

javascript - highcharts如何覆盖重置缩放按钮事件

javascript - 尽管 html 表中有数据,但仍显示 "No data available in table"

javascript - graphQl - 参数具有无效值预期\"contentfulStranNaslovQueryString_2\",发现不是对象

javascript - Graphql 上传获取 "Invalid JSON in the ‘operations’ 多部分字段”

graphql - 在 GraphQL 中解析相关数据的优雅且高效的方法

javascript - 当他在父元素之外时停止移动元素

javascript - 使 form-in-a-div 出现在内容之上

javascript - 使用 Apollo 执行突变后如何更新单独的组件 props