是否可以在GraphQL上弃用突变?

cla*_*ron 7 migration deprecated graphql

我要弃用一个变体:

updateObject(
  id: String!
  object: ObjectInput!
): Object!
Run Code Online (Sandbox Code Playgroud)

我们想将其更改为:

updateObject(
  object: UpdateObjectInput!
): Object!
Run Code Online (Sandbox Code Playgroud)

其中,ObjectInput和UpdateObjectInput是:

input ObjectInput {
  product: String!
  isPercentage: Boolean
  amount: Float!
  visibility: ObjectVisibility
  isDiscontinued: Boolean
  expiresAt: String
}
Run Code Online (Sandbox Code Playgroud)

input UpdateObjectInput {
  id: String!
  visibility: ObjectVisibility
  isDiscontinued: Boolean
  expiresAt: String
}
Run Code Online (Sandbox Code Playgroud)

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

我们尝试使突变超载或将突变标记为已弃用,但均无效。

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

还有另一种方法可以完成迁移吗?

Dan*_*den 7

弃用一个字段是装饰性的——它只是引入了可由客户端工具使用的元数据,并且可以在不更改字段描述的情况下提供有关该字段的附加信息。当对架构的更改否则将成为破坏性更改时,避免给客户带来问题的唯一方法是引入新的字段和/或参数。您已经提供了一些选项:

  1. 在 Mutation 类型上创建一个新字段
updateObject(
  id: String!
  object: ObjectInput!
): Object! @deprecated("Use updateObject2 instead")
updateObject2(
  object: UpdateObjectInput!
): Object!
Run Code Online (Sandbox Code Playgroud)
  1. 在现有字段上创建一个新参数。目前只能弃用字段和枚举值——您不能将 应用于@deprecated参数。
updateObject(
  """Don't use. Use object2 instead"""
  id: String!

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

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

  2. 只介绍突破性的变化。可以与客户端团队协调,在某个可接受的维护窗口内将更改部署到服务器和客户端。

  • 默认原因对我不起作用。必须包含为`@deprecated(原因:“使用 updateObject2 代替”)` (2认同)