删除突变的结果?

Posted

技术标签:

【中文标题】删除突变的结果?【英文标题】:Result of a delete mutation? 【发布时间】:2017-10-22 13:13:29 【问题描述】:

Graphql 中删除突变的结果应该是什么?我正在使用 graphql-ruby gem。这是我的突变示例,但我不确定我应该返回什么作为响应。

Mutations::Brands::Delete = GraphQL::Relay::Mutation.define do
  name "DeleteBrand"
  description "Delete a brand"

  input_field :id, types.ID

  # return_field ??

  resolve ->(object, inputs, ctx) 
    brand = Brand.find(inputs[:id])
    brand.destroy
  
end

【问题讨论】:

我认为最佳做法是准确返回您删除的内容,以便 graphql 知道需要删除的内容。 【参考方案1】:

我认为截至 2017 年 7 月尚不存在明确的事实标准,并且我发现实现之间存在很多差异(GitHub、Yelp、GraphCool、Shopify)。

但是,如果您看一下最近出现的一些 GraphQL API,似乎有一个共同的趋势。很大程度上,输入类型和响应类型是特定于突变的。例如,对于updateBrand 突变,您可能期望得到UpdateBrandInput,并返回UpdateBrandPayload 响应。请注意,输入不是BrandInput,而是以Brand 响应。您也不会使用标量布尔值(例如,true,如果成功)或已删除实体的 id(在删除突变的情况下)进行响应。按照这个约定,你可以有一个createBrand 突变,一个CreateBrandInput 和一个CreateBrandPayload 响应。

通过创建特定于突变的inputpayload 类型,您可以在期望和响应的领域拥有很大的灵活性。每次删除,您可能会有一个 DeleteBrandPayload 响应,其中不仅包括品牌的浅层(例如仅标量)字段,还包括其他相关数据(例如 clientMutationId)等。

老实说,我认为 GraphQL 规范提供了足够的绳索来吊死你自己,所以看看一些大人物是如何推出的是明智的。

【讨论】:

有趣的事情:我正在寻找这个答案(谢谢,它非常有用),碰巧,我正在处理的突变被命名为“createBrand”、“updateBrand”和“删除品牌”:D 如果有一些你所说的“大人物”代码示例的链接会很有趣,他们有几十个存储库 你可以在这里docs.github.com/en/graphql/overview/explorer 尝试来自 Github 的 GraphQL API(你必须登录),他们使用这个命名:DeleteBrandInputDeleteBrandPayload【参考方案2】:

您可以返回 deleted_id 或消息。如果它是关联对象,您可以返回更新的对象,如下例所示。

Destroy = GraphQL::Relay::Mutation.define do
name 'DestroyComment'
description 'Delete a comment and return post and deleted comment ID'

# Define input parameters
input_field :id, !types.ID

# Define return parameters
return_field :deletedId, !types.ID
return_field :article, ArticleType
return_field :errors, types.String

resolve ->(_obj, inputs, ctx) 
  comment = Comment.find_by_id(inputs[:id])
  return  errors: 'Comment not found'  if comment.nil?

  article = comment.article
  comment.destroy

   article: article.reload, deletedId: inputs[:id] 

http://tech.eshaiju.in/blog/2017/05/15/graphql-mutation-query-implementation-ruby-on-rails/

【讨论】:

这不会导致内存膨胀吗? @eshaiju

以上是关于删除突变的结果?的主要内容,如果未能解决你的问题,请参考以下文章

阿波罗客户端从商店中删除而没有突变

在单个 GraphQL 突变(graphene-django)中返回已删除对象的数组

在 Django GraphQL 中删除突变

如何在中继服务器中使用删除突变?

如何在 GraphQL 中创建删除突变?

在 Apollo 中删除突变后如何重定向?