图QL,“ on”对片段的作用

时间:2018-11-10 20:12:14

标签: graphql

我正在查看GraphQL,但感到困惑,为什么在使用如下片段时,必须定义“字符集”?可以是任何无法解释的名称,也可以是GraphQL文档中的上下文。

query {
  leftComparison: hero(id: "1") {
    ...comparisonFields
  }
  rightComparison: hero(id: "2") {
    ...comparisonFields
  }
}

fragment comparisonFields on Character {
  name
  appearsIn
  friends {
    name
  }
}

1 个答案:

答案 0 :(得分:1)

尽管the example on graphql.org并没有变得很明显,a fragment is always attached to some specific type(可以是对象类型,接口或联合)。在片段内部,您只能使用命名类型上存在的字段。服务器将为您进行检查(如果需要,客户端可以提前进行检查)。

如果字段返回接口或联合类型,则您可以类似地仅选择已知存在的字段(因为接口提供了它们),但是您可以尝试匹配实现该接口或属于该接口的特定类型联合以获取更多数据。这通常使用inline fragments来完成,但是由于命名片段已附加到类型上,因此您也可以使用命名片段。如果架构包含非常通用的查询

interface Node { id: ID! }
type Query {
  node(id: ID!): Node
}

Character实现Node,然后您可以在此处插入命名片段

query GetCharacterDetails($id: ID!) {
  node(id: $id) {
    ...comparisonFields
  }
}