如何使用 Apollo GraphQL 查询结果作为另一个查询的输入?又名:请求链接

How to use a Apollo GraphQL query result as the input of another one? Aka: request chaining

我知道 of 之前有人问过这个问题,但我没有找到明确的解决方案来确定 GraphQL 是否可行。我有一种强烈的感觉,这 应该 是可能的,因为在 Apollo 中按顺序 运行 进行 GraphQL 查询,它应该相对容易实现。

我遇到的情况是,我首先在客户端上执行 GraphQL 变更,然后在执行使用先前查询结果的查询后立即执行。这会导致等待服务器响应两个请求的响应时间不必要地长。请求如下所示:

mutation createWebSession($authId: ID!) {
  webSession: createWebSession(authId: $authId) {
    token
    userId
  }
}

query listUserPaymentMethods($userId: ID!) {
  userPaymentMethods: paymentMethods(userId: $userId) {
    id
  }
}

我知道 避免 与服务器进行 2 次往返的一个简单创可贴解决方案是创建一个新的单一 GraphQL 突变端点,该端点在后端提供两种服务。但这似乎违背了编写模块化、可重用的 GraphQL 端点的目的。因此,我很好奇是否有人知道 Apollo GraphQL 是否支持一种更简洁的方式来链接 2 个请求,其中前一个请求的结果可作为下一个请求的输入。

非常感谢任何帮助,谢谢。

这是一般 GraphQL 特有的限制。由于以下几个原因,单个请求无法执行此操作:

  • 虽然 GraphQL 文档可能包含任意数量的操作,但只会执行一个操作。如果文档包含多个操作,则所有操作都必须命名,并且请求必须包含一个 operationName 参数来指定要执行的操作。换句话说,虽然您可以将多个查询合并到一个操作中,或者将多个变更合并到一个操作中,但您不能混合匹配查询和变更。

  • 给定任意两个共享相同 "parent" 字段的字段,这两个字段将同时解析 唯一 的例外是根级突变字段,它们会按顺序解析。因此,GraphQL 不支持任何允许您引用另一个字段并将其用作某些参数的输入的语法。

一种可能的解决方法是在您的 createWebSession 负载类型中包含一个字段,该字段是 Query 类型。我在 this article 中说明了这种方法,作为 重新获取查询 的一种方式,但它也适用于您正在尝试做的事情。