graphql - 在 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 返回错误,但另一个请求仍然存在,没有被取消或取消订阅。
解决方案
这是服务器端的问题。GraphQL 支持部分响应,正如您现在亲身体验的那样。如果在解析字段时抛出错误,该字段将解析为 null 并且错误将添加到errors
响应内的数组中。
但是,如果发生错误的字段不为空,则错误将“冒泡”父字段。如果该字段也是非空的,它将冒泡到其父级,依此类推,直到它遇到一个可为空的字段或根。
这意味着这样的架构:
type Query {
firstQuery: SomeType
secondQuery: SomeOtherType
}
将允许任何一个 (firstQuery
或secondQuery
) 在执行期间抛出而不影响另一个。但我们可以这样做:
type Query {
firstQuery: SomeType!
secondQuery: SomeOtherType!
}
如果任一字段抛出,我们将简单地获取null
响应data
。
推荐阅读
- php - 在 xampp 中安装/启用存档引擎
- json - 在包 json Visual Studio 上手动更新角度版本会导致 node_modules 中的错误?
- fonts - 文本文件中的字符无法识别
- if-statement - 为什么我们使用“End If”语句?
- angular - Angular 7 e2e 量角器测试源文件的代码覆盖率
- amazon-web-services - Amazon Hive 中的 MultiDelimiterSerDe 设置
- angular - 不是一个函数Angular 2
- javascript - Phaser 3:销毁精灵的所有实例
- asp.net-mvc - ASP.NET Core 2.2 MVC - 身份 - 将自定义用户类放在哪里?
- keras - 从 keras 中的 pytorch 导入正确的模型