为什么TYPE_ADDED_TO_INTERFACE被认为是一项重大变化?

时间:2019-06-05 22:30:11

标签: graphql apollo-server

我正在使用GraphQL的Apollo Server实现以及Apollo Engine,特别是用于检查模式差异是否包含任何重大更改的功能。我想更好地理解为什么TYPE_ADDED_TO_INTERFACE被认为是一项重大更改,并且是否有人可以提供一个结果可能会中断的graphql查询示例?

我正在使用apollo/2.9.0 darwin-x64 node-v10.10.0通过apollo service:check命令执行模式检查。

例如,如果我有以下架构:

interface Animal {
  id: ID
}

type Dog implements Animal {
  id: ID
  favoriteToy: String
}

然后将其添加到架构中:

type Cat implements Animal {
  id: ID
}

这被认为是一个重大变化。为什么?

我可以看到,如果某人正在对所有Animal对象进行查询,并且在查询中有一个... on Dog片段,那么他们将开始只返回Cat对象接口字段,直到它们还添加了... on Cat片段。那被认为是坏事吗?

1 个答案:

答案 0 :(得分:1)

具有类型实现接口的它以前不应该中断现有查询。就您而言,即使省略了内联片段,结果仍将是有效的(如果未选择任何接口字段,则可能导致返回空对象,但这仍然是有效的响应)。

但是,我可以预见由于这种变化而导致的特定客户的问题。例如,在使用Apollo客户端时,我们经常创建一个IntrospectionFragmentMatcher来专门帮助客户端正确缓存来自联合或接口字段的结果。

  

为支持结果验证以及对并集和接口的精确片段匹配,可以使用称为IntrospectionFragmentMatcher的特殊片段匹配器。如果架构中与联合或接口类型有关的任何更改,则必须相应地更新片段匹配器。

换句话说,以这种方式进行模式更改可能会破坏客户端缓存行为。我怀疑对于进行基于模式的代码生成的客户端(例如apollo-android),这也可能导致运行时很奇怪。