概念、想法、策略
概念、想法、策略字段和指令版本控制的使用场景

字段和指令版本控制的使用场景

请先阅读指南 通过字段版本控制演进 Schema,该指南说明了 Gato GraphQL 的「字段版本控制」功能

Gato GraphQL 允许字段和指令接收参数 versionConstraint,以选择字段/指令的特定版本(即实现):

query GetPosts {
  posts(versionConstraint: "^1.0") {
    id
    title(versionConstraint: ">=2.1")
    excerpt @strUpperCase(versionConstraint: "~1.5.3")
  }
}

字段(或指令)也可以有一个默认实现,即没有版本号的那个(也是在 Query 中未提供 versionConstraint 时所使用的实现)。

在执行自省时,只会获取默认字段和指令的数据。因此,在自省时 versionConstraint 参数永远不会出现,因为默认字段或指令不支持该参数。

正因如此,我们必须始终事先了解某个字段或指令是否有两个或更多版本可供选择,并且需要知道这些版本号。这些信息默认情况下是不公开的。

那么,版本控制有什么用处呢?以下是几个使用场景。

为特定用户快速提供 Bug 修复

假设您在网站上部署了一个 GraphQL API,某位特定用户反映该字段未按预期工作。但这个问题只发生在该用户身上,其他人似乎没有遇到问题。

您找到并修复了问题,但希望在将变更部署给所有人之前确认其正常工作。此时,您可以将变更以版本 "1.0.1" 的新字段解析器形式部署,并要求该用户修改 GraphQL Query,将其指向该版本的字段:

{
  someBuggyField(versionConstraint: "1.0.1")
}

确认 Bug 确实已修复后,再将代码复制到默认字段解析器中。

邀请特定用户测试即将发布的版本

如果某个字段或指令已进行版本控制,且没有默认(即非版本化)实现,则在自省时将完全不可见。

{
  someField
    # This directive has no default implementation,
    # so it won't appear during introspection,
    # but it can still be added in the GraphQL query
    # when providing a constraint that satisfies it
    @someExperimentalDirective(versionConstraint: ">1.0")
}

您可以部署该字段或指令,使其在 GraphQL API 中不可见,然后邀请特定用户进行测试。这些用户需要在 Query 中输入相应的 versionConstraint 参数才能使用它。

一旦被接受,版本控制将被移除,字段或指令将通过自省变为可见,从而对所有人开放。