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

时间:2019-09-16 19:00:11

标签: 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个请求,其中前一个请求的结果可作为下一个输入使用。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

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

  • 尽管GraphQL文档可以包括任何数量的操作,但仅将执行一个操作。如果文档包含多个操作,则必须命名所有操作,并且请求必须包含一个operationName参数,该参数指定要执行的操作。换句话说,虽然您可以将多个查询合并到一个操作中,或者将多个变异合并到一个操作中,但是您不能将查询和变异混在一起。

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

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