是否有可能在GraphQL上弃用变异?

时间:2018-01-11 17:53:29

标签: migration graphql deprecated

我有一个我们想要弃用的变异:

updateObject(
  id: String!
  object: ObjectInput!
): Object!

我们想将其更改为:

updateObject(
  object: UpdateObjectInput!
): Object!

ObjectInput和UpdateObjectInput是:

input ObjectInput {
  product: String!
  isPercentage: Boolean
  amount: Float!
  visibility: ObjectVisibility
  isDiscontinued: Boolean
  expiresAt: String
}

input UpdateObjectInput {
  id: String!
  visibility: ObjectVisibility
  isDiscontinued: Boolean
  expiresAt: String
}

基本上,ObjectInput非常适合创建Object,但不适合更新它。

我们已经尝试重载突变或将变异标记为已弃用,但都不起作用。

我们提出的唯一其他解决方案是将新的updateObject变种重命名为其他内容,例如“newUpdateObject”,或者将id和object字段弃用并且是可选的,然后添加字段“updateObject”或者其他内容这将采用新的UpdateObjectInput。但是,这些都不是最佳的。

还有其他方法可以完成迁移吗?

1 个答案:

答案 0 :(得分:5)

弃用字段是一种修饰-它仅引入可由客户端工具使用的元数据,并且可以在不更改字段描述的情况下提供有关该字段的其他信息。如果对模式的更改原本是重大更改,那么避免给客户造成问题的唯一方法是引入新的字段和/或参数。您已经介绍了一些选项:

  1. 在“突变”类型上创建一个新字段
updateObject(
  id: String!
  object: ObjectInput!
): Object! @deprecated("Use updateObject2 instead")
updateObject2(
  object: UpdateObjectInput!
): Object!
  1. 在现有字段上创建一个新参数。此时只能弃用字段和枚举值-您不能将@deprecated应用于参数。
updateObject(
  """Don't use. Use object2 instead"""
  id: String!

  """Don't use. Use object2 instead"""
  object: ObjectInput!

  object2: UpdateObjectInput!
): Object!
  1. 版本的API。在其当前端点维护现有架构,但在其他端点引入更新的架构。指导您的客户团队切换到新端点。

  2. 仅介绍重大更改。可以与客户团队进行协调,以便在某个可接受的维护时段内将更改部署到服务器和客户端。