如何在GraphQL Apollo客户端

时间:2017-12-07 09:13:02

标签: asynchronous rabbitmq graphql apollo apollo-client

结构

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

实施

我们有一个Apollo服务器,我们发送突变,这些服务器始终提供null,因为它们是异步的。结果将通过订阅发回。 我目前已经像这样实现了它。

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

正如你所看到的......不是最理想的方式,而且客户端也很复杂。

愿意让客户尽可能地愚蠢并降低复杂性。 似乎Apollo主要是为同步突变而设计的(这是合乎逻辑的)。

您对实施此方法的更好方法有何看法?

1 个答案:

答案 0 :(得分:2)

突变可以是异步的

Apollo Client中的突变通常不同步。只要需要,客户端就可以等待突变结果。您可能不希望GraphQL服务在此期间保持HTTP连接打开,这似乎是您在此处理的问题。你对突变做出反应的方法违背了GraphQL的设计方式,并开始产生复杂性 - 在我看来 - 你不想拥有它。

解决实施级别的问题 - 而不是API级别

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

利用Apollo客户端灵活的链接系统

这就是Apollo Client 2的用武之地.Apollo Client 2允许您编写自己的网络链接来处理客户端服务器通信。如果您在链接级别解决通信问题,开发人员可以在不知道网络通信细节的情况下使用客户端。

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