You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法多次调用Fetch API?报错TypeError: Response体流已读取求助

解决TypeError: Failed to execute 'json' on 'Response': body stream already read问题

嘿,这个坑我之前踩过!你代码里的问题一眼就能看出来——你重复利用了同一个fetch返回的Promise对象a,还两次调用了它的.json()方法。

为啥会报错?

Fetch API返回的Response对象里的body是个「可读流」,这个流有个关键特性:只能被读取一次。第一次调用.json()的时候,已经把整个流的内容读完并解析成JSON了;等你第二次再调用.json(),流已经空了,自然就会抛出"body stream already read"的错误。

看你的代码,你把fetch(thisIsUrl)的结果存在了变量a里,然后先后两次给a绑定.then()回调,每次都尝试读取流解析JSON,这就直接触发了这个问题。

怎么修复?

有两种靠谱的解决方式,选哪种看你的需求:

方式一:解析一次数据,复用结果(推荐)

如果只是需要多次使用API返回的数据,完全没必要重复读取流。第一次解析后把数据存下来,后续直接用这个解析好的对象就行:

let thisIsUrl = 'https://api.covid19api.com/summary'; 
fetch(thisIsUrl)
  .then((data) => {
    return data.json() // 这里只解析一次流
  })
  .then((apidata) => {
    console.log('第一次打印数据:', apidata)
    // 直接复用已经解析好的apidata做其他操作
    console.log('第二次打印数据:', apidata)
    return apidata
  })
  .catch((error) => {
    console.log('请求出错:', error)
  })

方式二:发起两次独立的请求(仅在真的需要时用)

如果你确实需要两次独立的API调用(比如担心数据有更新),那每次都重新调用fetch就行,这样每次都会拿到一个新的Response对象,流也是新鲜的:

let thisIsUrl = 'https://api.covid19api.com/summary'; 

// 第一次请求
fetch(thisIsUrl)
  .then((data) => data.json())
  .then((apidata) => console.log('第一次请求数据:', apidata))
  .catch((error) => console.log('第一次请求出错:', error))

// 第二次请求
fetch(thisIsUrl)
  .then((fetchdata) => fetchdata.json())
  .then((readingData) => console.log('第二次请求数据:', readingData))
  .catch((err) => console.log('第二次请求出错:', err))

显然第一种方式更高效,能省一次网络请求,也避免了流读取的问题。

内容的提问来源于stack exchange,提问作者Shourya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:18:54