“ AbortError: BodyStream Buffer 已中止 ” 当未订阅多部分订阅时( BaseHttpLink)

作者: ItaiYosephi创建于 2026年2月24日更新于 2026年5月10日
标签🏓 awaiting-team-response

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 ()' 宣传它 → 未被发现 。

zz
返回 () {{{{{{{}
如果( 控制器) 控制器. 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? 进口=真实性

  • 复制步骤
  1. ** 开放复制**

2. **在浏览器中打开应用**(如:http://localhost:3000或CodeSandbox预览).

3. **Click"Start订阅"**开始多段HTTP订阅.

4. **检查浏览器控制台** – 您应该看到:

未抓取( 承诺中) 中止错误 : BodyStream Buffer 已中止


** 发生的情况:** MSW 模拟返回带有错误块的多段响应 。 " 下一个 " 处理者收到错误时,就称 " 订阅.unsits () " 。 这触发了BaseHttpLink的倒闭,它呼唤
. . . . . . .

内容来源: apollographql/apollo-client