“ AbortError: BodyStream Buffer 已中止 ” 当未订阅多部分订阅时( BaseHttpLink)
QQ 问题描述
描述
在多部分的 HTTP 订阅过程中调用 ' 订阅. uns订阅 ()' , 原因 ** 未发生(承诺) 中止 Error: BodyStream Buffer 被中止**. 与 [# 13125] (https://GitHub.com/ apollographql/ apollo-client/issues/13125)有关。
** Root 原因:** BaseHttpLink 中可观察的撕毁在订阅未订阅时称为controller.abrt ()'. 当时,Read MultipartBody'仍在通过reader.read()'消耗response.body'。 流产杀死了流 → Readers.read ()' 以中止错误来拒绝 → .catch ()' 宣传它 → 未被发现 。
返回 () {{{{{{{}
如果( 控制器) 控制器. bort (); // QQ 触发在读多部分Body中中止错误
* ;** 建议的固定办法:** 在`src/link/http/BaseHttpLink.ts ' 中,用一面旗帜跟踪故意撕毁情况:
[TypeScript] (b) 让doAbort=虚假; 返回新的可观测(( 观测)) {{ /. 获取设置... 当前箭头 (...) 那时(. .catch(err) {{ 清理管理员( ); 如果( didAbort) 返回; // 故意从拆卸中中止 观察员.error(err);
- ; 返回 () {{{{{{{} = 事实; 如果(控制器)控制器.abort();
- ;
- ;
□再现.
消费者代码 - 订阅错误时不订阅的 'next' 处理器 :
```2ZZ
const 订阅 = 客户端. 订阅 ({
查询:一些文档,
变量:{输入:{.}}},
}). 订阅({
下一个:({数据,错误}}{{{
如果( 错误) {
订阅. un订阅( ); / / QQ 触发中止错误
设置记录( 假);
// 处理出错...
否则
setData(数据);
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn华文楷体\fs16\1cHE0E0E0}
完成:() {{{},
* ;** 梯队:** 运行多部分订阅( MSW 模拟或真实服务器) 接收带有 GraphQL 错误的块 订阅. un订阅 ()' 在next ' 中 中止控制台中的错误 。
** Workaround:** 不要在错误分支中调用`订阅.un订阅()';让溪流自然地完成.
□ 环境
- `apollo/客户 ':4.1.4
- 多部分HTTP订阅(GraphOS) -克罗姆
- 链接到复制
https://codesandbox.io/p/GitHub/ItaiYosephi/apollo-bort-error-repro/main? 进口=真实性
- 复制步骤
- ** 开放复制**
- 密码箱:https://codesandbox.io/p/GitHub/Itai Yosephi/apollo-abort-error-repro
- 或克隆并在当地运行: {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? git Clone https://GitHub.com/ItaiYosephi/apollo-abort-error-repro.git (英语). cd apollo-bort-error-repro (英语: npm 安装 npm 开始
2. **在浏览器中打开应用**(如:http://localhost:3000或CodeSandbox预览).
3. **Click"Start订阅"**开始多段HTTP订阅.
4. **检查浏览器控制台** – 您应该看到:未抓取( 承诺中) 中止错误 : BodyStream Buffer 已中止
** 发生的情况:** MSW 模拟返回带有错误块的多段响应 。 " 下一个 " 处理者收到错误时,就称 " 订阅.unsits () " 。 这触发了BaseHttpLink的倒闭,它呼唤
. . . . . . .内容来源: apollographql/apollo-client