在graphql中突变后查询

Posted

技术标签:

【中文标题】在graphql中突变后查询【英文标题】:Query after mutation in graphql 【发布时间】:2018-09-17 19:20:30 【问题描述】:

有件事我觉得应该很简单,但是在网上搜索了很长时间都找不到答案:

我只是尝试使用 graphql 进行突变,然后使用另一个 graphql 查询刷新数据之后,我怎样才能仅在一个 HTTP(graphql) 请求中实现这一点?

尝试失败:

    我尝试使用 batching 发送包装在一个数组中的两个 graphql 模式,但它是异步的,并且查询会在不需要的突变之前返回。 我尝试使用实际不发生任何突变的突变编写相同的查询,并将其放在真正的突变之后,这是可行的,但我不认为这是针对此问题的优化解决方案。 另外,我知道 apollo-client(react) 有类似 update(refetchQuery) 之类的东西,但是如果没有任何客户端框架,我怎么能做到这一点?

谢谢:)

相关链接:

Mutation and a query in the same time Can I avoid using refetchQueries with Apollo GraphQL?

【问题讨论】:

是否可以修改变异结果,直接获取查询数据,无需额外查询? 谢谢,这肯定是一个很好的解决方案。但问题是当我无法决定响应应该是什么样子或者我需要更复杂的数据时。我认为这些情况确实存在,但您的答案确实适用于您的情况。 在这种情况下,接口和联合类型可能会有所帮助。你可以在这里阅读它们:graphql.org/learn/schema我没有使用它们的经验,但也许它们可以成为你案例解决方案的一部分。 【参考方案1】:

如果我对您的理解正确,您想发送一个突变,并在同一个请求/查询中发送一个查询,等待突变完成后再解决。从规范的角度来看,这根本不可能(还)。您可以阅读规范 here(我知道技术规范听起来很吓人,但如果您已经对 GraphQL 有点熟悉,那么它很容易阅读 :-))。

这个想法是突变结果旨在潜在地返回已更新的数据。不久前我在一篇关于查询对象类型的文章中读到。这篇文章强调了该类型是如何只是一个普通的对象类型,并且可以简单地在突变结果中返回。虽然 我不推荐这种模式,因为我认为突变结果应该明确列出所有更新的对象,但它当然是可能的,并且可以成为非常复杂情况的解决方案(如您所描述的情况)。为了使这更直观,这里有一个示例模式:

type ExampleMutationResult 
  success: Boolean!
  query: Query!


type Query 
  queryField: String!


type Mutation 
  exampleMutation: ExampleMutationResult!


# Query would look like this
mutation example 
  exampleMutation 
    success
    query 
      queryField
    
  

正如您所见,权衡相对较高,只有在您可以更改架构时才能启用。我会先检查第二个 HTTP 请求的开销是否真的需要优化。

【讨论】:

哇,嵌套解析器对吗?这也应该是一个聪明可行的解决方案。但正如您所指出的,这也不是推荐的解决方案,非常感谢。也许我应该等待诸如请求控制流或规范中的一些新功能之类的东西。

以上是关于在graphql中突变后查询的主要内容,如果未能解决你的问题,请参考以下文章

获取查询后有条件地执行 graphql 突变

Vuex 状态随突变而变化 - apollo graphql 查询

删除突变后不重新获取查询(Apollo Graphql & Nextjs)

GraphQL - 如何在查询多个突变期间检索先前突变的 id

如何在 GraphQL 中执行突变?

在 Django GraphQL 中删除突变