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

sga*_*dev 0 apollo graphql apollo-server apollo-client

我知道这已经被问了几个时间之前,但我发现没有明确的解决方案,这是否是可能的GraphQL。我强烈认为这应该是可能的,因为它应该相对容易实现,因为 GraphQL 查询在 Apollo 中按顺序运行。

我有一种情况,我首先在客户端上执行 GraphQL 突变,然后在执行使用上一个查询结果的查询之后立即执行。这会导致等待服务器响应两个请求的响应时间过长。请求如下所示:

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

query listUserPaymentMethods($userId: ID!) {
  userPaymentMethods: paymentMethods(userId: $userId) {
    id
  }
}
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将不胜感激,谢谢。

Dan*_*den 5

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

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

  • 由于共享同一个“父”字段中的任何两个领域,这两个领域将解决在同一时间。该唯一的例外是根级别突变领域里面做的决心序列。因此,GraphQL 不支持任何允许您引用另一个字段并将其用作某些参数的输入的语法。

一种可能的解决方法是在createWebSession负载类型中包含一个字段,其字段是Query类型。我在本文中将这种方法说明为重新获取查询的一种方式,但它也适用于您尝试执行的操作。

  • 这是对为什么无法做到这一点的精彩而详细的解释。谢谢! (2认同)