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

Posted

技术标签:

【中文标题】如何使用 Apollo GraphQL 查询结果作为另一个查询的输入?又名:请求链【英文标题】:How to use a Apollo GraphQL query result as the input of another one? Aka: request chaining 【发布时间】:2020-01-17 15:34:39 【问题描述】:

我知道之前有人问过 couple 或 times,但我没有找到明确的解决方案来确定是否可以使用 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 个请求,其中前一个请求的结果可作为输入提供给下一个请求。

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

这是一个很棒的详细解释为什么它不能完成。谢谢!

以上是关于如何使用 Apollo GraphQL 查询结果作为另一个查询的输入?又名:请求链的主要内容,如果未能解决你的问题,请参考以下文章

vue-apollo:GraphQL 查询仅在使用 <ApolloQuery> 标签时运行。永远不会在脚本代码中工作。 this.$apollo.queries 为空

如何在 React + Apollo GraphQL 中查询先前查询的结果?

如何将graphql查询的结果作为文件发送?

如何将数据从反应组件传递到 Apollo graphql 查询?

带参数的 Apollo graphql 查询

vue apollo 4 不返回 graphql 查询结果