首页 > 解决方案 > 在 GraphQL 中失败时如何取消挂起的查询?

问题描述

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

因此,当一个失败返回该可观察对象的错误和服务器响应时,请求就结束了。但是所有其他的 observables 仍然活着并且随着时间的推移变得完整,并且永远不会到达客户端,因为请求已经结束。

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

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

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

标签: graphqlnestjs

解决方案


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

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

这意味着这样的架构:

type Query {
  firstQuery: SomeType
  secondQuery: SomeOtherType
}

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

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

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


推荐阅读