根据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)
具体来说,重大更改是对模式结构的更改,这会导致已编写的查询失败。我在网上找不到详尽的列表,但以下是一些重大更改的示例:
Int为String,使用该字段的客户端可能会因新响应而出现类型错误)。新的枚举值可能会破坏客户端(如果它没有代码来处理新情况,则可能会出现运行时错误),但我认为这是客户端设计问题,而不是对架构的重大更改!
TLDR:向枚举添加值被认为是“潜在危险的更改”。
根据规范(http://spec.graphql.org/October2021/#sec-Validation.Type-system-evolution)
任何可能导致以前有效的请求变得无效的更改都被视为重大更改。
我试图找到一份明确的重大变更列表,但这比我预期的要困难。看来 graphql-js 中同时存在“重大更改”和“危险更改”的概念,对应于两个函数findBreakingChanges和findDangerousChanges。findDangerousChanges建议通过此 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
| 归档时间: |
|
| 查看次数: |
3604 次 |
| 最近记录: |