GraphQL:如何在突变成功后发出警告?

Posted

技术标签:

【中文标题】GraphQL:如何在突变成功后发出警告?【英文标题】:GraphQL: how can I throw a warning after a successful mutation? 【发布时间】:2018-09-26 20:58:27 【问题描述】:

假设我有一个插入新帖子的createPost 突变。在典型的应用程序中,该突变可以:

成功,返回Post。 失败,抛出一个错误(我使用apollo-errors 来处理这个问题)。

我想要实现的是一个中间场景,突变成功(返回Post);但以某种方式向用户返回警告(例如Your post is similar to post XYZ或类似的)。

什么是一个好的 GraphQL 模式来实现这个?在Post 类型中添加warning 字段似乎有点奇怪,但我又不确定如何在同一个突变中返回PostWarning?有什么想法吗?

(请注意,我以这种情况为例,我对返回额外突变后数据的一般模式感兴趣,而不是专门找到类似的帖子)

【问题讨论】:

【参考方案1】:

我所有的突变都返回一个包装有效负载类型而不是单个值类型(例如Post 在你的情况下),我也不会抛出 GraphQL,除非它是一个真正的系统错误——如果这是用户的结果输入或者是其他预期的情况,我将其建模为返回类型。

返回包装负载通常被认为是一种最佳实践,因为 a) 您的变异应该返回图中可能已更改的 所有内容 的入口点(不仅仅是新帖子),并且 b) 它让您可以轻松地在以后向返回类型添加新字段。

请记住,突变本质上是一个函数,它接收一些输入数据和当前图,并返回一个新图。考虑类似 REST 的 CRUD 操作通常是错误的。

type CreatePostError = 
    // Whatever you want


type CreatePostSuccess = 
    post: Post!
    warning: String


union CreatePostPayload = CreatePostSuccess | CreatePostError

mutation 
    // Other mutations
    createPost(/* args /*): CreatePostPayload

【讨论】:

这很有意义,并且从四处询问看来确实是共识的最佳实践。谢谢! 只要客户端请求警告,@AndrewIngram 就不会这样做。我发现这篇文章正在寻找一种可能返回一些警告消息的方法,例如即将被弃用的功能等。

以上是关于GraphQL:如何在突变成功后发出警告?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Apollo / GraphQL 发生突变后更新缓存?

拨号器(通过 Dialyxir)从 Absinthe (GraphQL) 路由的 `forward` 命令发出有关“但此值不匹配”的警告。如何解决?

在 Django GraphQL 中删除突变

GraphQL 对突变的速率限制

Sequelize with GraphQl:如何使用突变更新字段

如何在 GraphQL 中执行突变?