【问题标题】:How cancel pending queries when one fails in GraphQL?在 GraphQL 中失败时如何取消挂起的查询?
【发布时间】:2019-12-10 11:26:00
【问题描述】:

我有一个运行 NestJs 的 GraphQL 服务器。当我使用各种查询发出请求时,我想取消每个待处理的可观察对象并在其中一个失败时返回错误。我使用 Axios 作为 http 客户端。

所以,当一个失败返回那个 observable 的错误和服务器响应时,请求就结束了。但是所有其他的 observables 仍然活着并且随着时间的推移变得完整,并且由于请求结束而永远不会到达客户端。

我如何取消所有待处理的 observables??

query combine {
  firstQuery { <--- this fail
    fieldOne
  }
  secondQuery { <-- this keep the request alive
    secondOne
  }
}

更新 在示例中,两个查询都使用 Axios Http Client 向另一个资源发出 Http 请求。因此,当其中一个抛出错误时,服务器 GraphQL 会返回错误,但另一个请求仍然存在,没有被取消或取消订阅。

【问题讨论】:

    标签: graphql nestjs


    【解决方案1】:

    这是一个服务器端问题。 GraphQL 支持部分响应,正如您现在亲身体验的那样。如果在解析字段时抛出错误,则该字段将解析为 null,并将错误添加到响应中的 errors 数组中。

    但是,如果发生错误的字段不为空,则错误将“冒泡”父字段。如果该字段也是非空的,它会冒泡到它的父级,依此类推,直到它碰到一个可以为空的字段或根。

    这意味着这样的架构:

    type Query {
      firstQuery: SomeType
      secondQuery: SomeOtherType
    }
    

    将允许任何一个(firstQuerysecondQuery)在执行期间抛出而不影响另一个。但我们可以这样做:

    type Query {
      firstQuery: SomeType!
      secondQuery: SomeOtherType!
    }
    

    如果任一字段抛出,我们将简单地在响应中为data 获取null

    【讨论】:

    • 嗨,我更新了这个问题,更好地解释了这个案例。 (在示例中,两个查询都使用 Axios Http Client 向另一个资源发出 Http 请求。因此,当其中一个抛出错误时,服务器 GraphQL 返回错误,但另一个请求仍然存在,没有被取消或取消订阅)
    猜你喜欢
    • 2021-10-03
    • 2019-11-06
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2012-06-03
    • 2019-04-16
    • 2017-09-17
    相关资源
    最近更新 更多