JavaScript fetch - 未能在“响应”上执行“json”:body stream被锁定

2022-08-30 04:06:45

当请求状态大于400(我尝试了400,423,429状态)时,fetch无法读取返回的json内容。浏览器控制台中显示以下错误

未捕获(承诺中)类型错误:未能在“响应”上执行“json”:正文流已锁定

我显示了返回的响应对象的内容,如下所示:

enter image description here

但我仍然可以在几个月前使用它。

我的问题如下:

  • 这只是Chrome浏览器的行为还是抓取标准的变化?
  • 有没有办法获得这些状态的身体内容?

PS:我的浏览器版本是 谷歌浏览器 70.0.3538.102(正式版本) (64 位)


答案 1

我也遇到了这个错误,但发现它与响应状态无关,真正的问题是你只能消费一次,如果你消费了不止一次,错误就会发生。Response.json()

如下图所示:

    fetch('http://localhost:3000/movies').then(response =>{
    console.log(response);
    if(response.ok){
         console.log(response.json()); //first consume it in console.log
        return response.json(); //then consume it again, the error happens

    }

因此,解决方案是避免在块中消耗多次。Response.json()then


答案 2

根据MDN,你应该使用React.clone()

Response 接口的方法创建响应对象的克隆,该对象在各个方面都相同,但存储在不同的变量中。存在的主要原因是允许Body对象的多种用途(当它们仅一次性使用时)。clone()clone()

示例

fetch('yourfile.json').then(res=>res.clone().json())