添加 Enum 值对 GraphQL 来说是一个重大改变吗?

Dev*_*kle 9 graphql

根据GraphQL 最佳实践,GraphQL 服务应遵循“始终避免重大更改并提供无版本 API 的常见做法”。

如果遵循最佳实践,向枚举添加值是否被视为应避免的重大更改?

为了说明这一点,假设该模式具有以下枚举:

enum Episode {
  NEWHOPE
  EMPIRE
  JEDI
}
Run Code Online (Sandbox Code Playgroud)

在未来的某个时候将枚举发展为这样是不是不好的做法:

enum Episode {
  NEWHOPE
  EMPIRE
  JEDI
  FORCEAWAKENS
  ROGUEONE
}
Run Code Online (Sandbox Code Playgroud)

rmo*_*lgo 6

具体来说,重大更改是对模式结构的更改,这会导致已编写的查询失败。我在网上找不到详尽的列表,但以下是一些重大更改的示例:

  • 从对象类型中删除字段(使用该字段的查询将变得无效)
  • 向字段添加必需的参数(使用没有该参数的字段的查询将无效)
  • 当新类型不是旧类型的超类型时,更改字段的返回类型(例如,从 更改IntString,使用该字段的客户端可能会因新响应而出现类型错误)。

新的枚举值可能会破坏客户端(如果它没有代码来处理新情况,则可能会出现运行时错误),但我认为这是客户端设计问题,而不是对架构的重大更改!

  • 唱反调:枚举的好处之一是它们“[验证此类型的任何参数都是允许的值之一](http://graphql.org/learn/schema/#enumeration-types)”。如果客户端成为一个可以增长的任意列表,那么客户端如何知道允许什么?我知道 [Apollo iOS 客户端](http://dev.apollodata.com/ios/) 会将任何具有未知枚举值的响应视为错误。我想不出在这种情况下你还能做些什么。您是否期望客户以不同的方式处理响应? (4认同)

the*_*red 2

TLDR:向枚举添加值被认为是“潜在危险的更改”。

根据规范(http://spec.graphql.org/October2021/#sec-Validation.Type-system-evolution

任何可能导致以前有效的请求变得无效的更改都被视为重大更改。

我试图找到一份明确的重大变更列表,但这比我预期的要困难。看来 graphql-js 中同时存在“重大更改”和“危险更改”的概念,对应于两个函数findBreakingChangesfindDangerousChangesfindDangerousChanges建议通过此 PR 添加: https: //github.com/graphql/graphql-js/pull/701#issuecomment-277851631,因为虽然有些更改不符合“破坏”的定义,但根据它们的规范仍然“有潜在危险”。根据代码,向枚举添加值被认为是“潜在危险的更改”: https ://github.com/graphql/graphql-js/blob/40ff40a21c710372330e65f0fb58f13c2df92a77/src/utilities/findBreakingChanges.ts#L37-L63