如何在 GraphQL Apollo 客户端中处理异步突变

Posted

技术标签:

【中文标题】如何在 GraphQL Apollo 客户端中处理异步突变【英文标题】:How to handle async mutations in GraphQL Apollo client 【发布时间】:2018-05-21 08:18:36 【问题描述】:

结构

这是一个如何在我们当前的基础架构中最好地使用 Apollo Client 2 的问题。我们有一个连接到多个其他端点的 Graphql 服务器(Apollo 服务器 2)。突变通过 RabbitMQ 发送,我们的 Graphql 也监听 RabbitMQ,然后通过订阅推送到客户端。

实施

我们有一个 Apollo 服务器,我们发送突变,这些总是给出null,因为它们是异步的。结果将通过订阅发回。 我目前是这样实现的。

发送突变。 创建optimisticResponse。 通过writeQueryupdate 函数中乐观地更新状态。 当真正的响应到来(为空)时,在update 方法中再次使用optimisticResponse。 等待订阅返回响应。 然后用实际数据刷新状态/组件。

如您所见.. 这不是最理想的方式,而且客户端非常复杂。

希望尽可能让客户保持沉默并降低复杂性。 似乎 Apollo 主要是为同步突变而设计的(这是合乎逻辑的)。

您对更好的实现方式有何想法?

【问题讨论】:

【参考方案1】:

突变可以是异步的

突变在 Apollo 客户端中通常不是同步的。客户端可以根据需要等待突变结果。您可能不希望您的 GraphQL 服务在这段时间内保持 HTTP 连接打开,这似乎是您在此处处理的问题。您应对突变的方法与 GraphQL 的设计工作方式背道而驰,并且开始产生复杂性 - 在我看来 - 你不想拥有。

在实现层面解决问题——而不是 API 层面

我想让这项工作更好的想法如下:遵循 GraphQL 规范和教条方法。让突变返回突变结果。这将创建一个任何开发人员都熟悉的 API。而是将这些结果的交付视为您要解决的实际问题。 GraphQL 没有指定客户端服务器通信的传输协议。如果您在服务器和客户端之间运行的 websockets 已经抛弃了 HTTP 并完全在套接字级别上运行。

利用 Apollo Client 的灵活链接系统

这就是 Apollo Client 2 的用武之地。Apollo Client 2 让您可以编写自己的网络链接来处理客户端服务器通信。如果在链路层解决通信,开发者可以在不了解网络通信细节的情况下,照常使用客户端。

我希望这会有所帮助,您仍然有机会朝这个方向前进。我知道这可能需要在服务器端进行更改,但当您的应用程序前端很重时(因为现在大多数应用程序都是如此),这可能是完全值得的

【讨论】:

以上是关于如何在 GraphQL Apollo 客户端中处理异步突变的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React-Apollo 处理 GraphQL 错误?

Apollo GraphQL - 如何将 RxJS 主题用作 Apollo 客户端的变量?

未处理的 GraphQL 订阅错误

如何在客户端 NextJS 中使用 Apollo GraphQL 订阅?

如何在 jest / apollo 客户端中捕获被拒绝的 graphql 订阅?

如何使用 apollo 客户端从 schema.graphql 中提取 typescript 接口:codegen