在GraphQL中失败时如何取消待处理的查询?

时间:2019-08-01 20:00:53

标签: graphql nestjs

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

因此,当一次失败返回该可观察到的错误和服务器响应时,该请求将结束。但是其他所有可观察对象仍然存在,并且随着时间的流逝而变得完整,因为请求已结束,因此从未到达客户端。

我如何取消所有待处理的可观察物?

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

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

1 个答案:

答案 0 :(得分:0)

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

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

这意味着这样的模式:

type Query {
  firstQuery: SomeType
  secondQuery: SomeOtherType
}

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

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

如果任何一个字段抛出,我们都将在响应中null中得到data