graphql - 如何使用 Apollo GraphQL 查询结果作为另一个查询的输入?又名 : request chaining

标签 graphql apollo apollo-client apollo-server

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

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

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

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

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

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

最佳答案

这是一个特定于 GraphQL 的限制。 单个请求无法做到这一点,原因如下:

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

  • 给定任何两个共享相同“父”字段的字段,这两个字段将同时解析唯一的异常(exception)是根级别的突变字段,它们确实按顺序解析。因此,GraphQL 不支持任何可以让您引用另一个字段并将其用作某些参数的输入的语法。

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

关于graphql - 如何使用 Apollo GraphQL 查询结果作为另一个查询的输入?又名 : request chaining,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57962916/

相关文章:

javascript - 是否可以使用 Graphql 生成的模式作为流定义?

django - Apollo-client 在向服务器发送突变时返回 "400 (Bad Request) Error"

reactjs - 无法使用 Apollo Client 3 和 setContext (apollo-link-context) 设置 Auth Headers

javascript - 从 React 应用程序向 graphql API 发送一个枚举

javascript - 为什么我应该在 urql 上使用 Apollo/Relay?

GraphQL - 有条件地执行子查询

reactjs - Next.js 在 GraphQL 突变内重定向

javascript - 正确使用 onCompleted 进行 GraphQL 突变

javascript - GraphQL( Apollo ): Can you access directives within resolve function?

express - res.cookie 不适用于 apollo-server-express