GraphQL是一种查询语言,它允许我们使用统一的API来获取数据,减少数据响应的复杂性。 GraphQL中的schema定义了API中可用的类型和字段。在实际应用中,schema是一个重要的组成部分,我们需要处理它的变更以保持API的一致性和稳定性。
处理类型变更的方法
GraphQL schema有两个部分:类型定义和字段定义。 如果我们更改了任何一个部分,API的行为可能会发生不兼容的改变。 在以下情况下,如果我们需要更改API,则必须更改schema中的定义:
- 添加一个新的查询类型
- 删除一个现有查询类型
- 添加一个新的数据类型
- 删除一个现有数据类型
- 更新字段名称
- 更改字段类型
- 更改字段的返回值
在以下情况下,我们可以不更改现有的schema:
- 添加新的查询字段
- 更改某个字段的默认值
在GraphQL中,要处理类型变更,我们可以使用以下两个方法:
Backward-compatible Changes
Backward-compatible变更是指可以在不更改现有客户端行为的情况下进行更改的变更。在这种情况下,我们只需添加一个新的字段或类型,而不是删除或更改现有的字段或类型。
例如,在以下schema中:
type User { name: String! email: String! age: Int }
我们可以添加一个新的字段,而不会破坏现有客户端的行为:
type User { name: String! email: String! age: Int address: String }
现有的客户端可以忽略新的“address”字段,而不受影响。
Breaking Changes
Breaking Changes是指更改现有客户端行为的更改。在这种情况下,我们需要更改现有的字段或类型,这样可能会影响现有客户端的数据获取方式。
例如,在以下schema中:
type User { name: String! email: String! age: Int }
如果我们更改“email”字段的类型为整数,这样可能会破坏现有客户端的数据获取方式:
type User { name: String! email: Int! age: Int }
在这种情况下,我们必须更新现有的客户端代码以适应新的schema更改。
以代码为例
我们可以通过使用GraphQL schema的Javascript语言扩展(.gql
或.graphql
)来定义schema。在下面的示例中,我们使用schema定义一个图书馆的查询:
-- -------------------- ---- ------- ---- ---- - ------ ------- ------- ------- ------ ---- - ---- ----- - ------------ ----- ------ -
现在,假设我们要添加一个description字段来描述每本图书的简介。为此,我们需要更改schema定义:
-- -------------------- ---- ------- ---- ---- - ------ ------- ------- ------- ------ ---- ------------ ------ - ---- ----- - ------------ ----- ------ -
但是,如果我们尝试更改title字段的类型,例如更改为可选的字符串,则这可能会破坏我们的客户端代码:
-- -------------------- ---- ------- ---- ---- - ------ ------ ------- ------- ------ ---- ------------ ------ - ---- ----- - ------------ ----- ------ -
在这种情况下,我们必须更新现有的客户端代码以适应新的schema更改。
结论
在GraphQL中,schema是API的核心组成部分。我们必须小心处理类型变更,以保持API的一致性和稳定性。对于Backward-compatible变更,我们可以添加新的字段和类型,而不破坏现有客户端的行为。对于Breaking Changes,我们必须更新现有的客户端代码。 处理类型变更需要小心谨慎,但需要有计划地进行,以确保API一直稳定并按预期工作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6706326dd91dce0dc859c300