当请求状态大于400(我尝试过400、423、429个状态)时,提取无法读取返回的json内容。浏览器控制台中显示以下错误
未捕获(承诺)TypeError:无法在执行“ json” “响应”:体内流被锁定
我显示了返回的响应对象的内容,如下所示:
但是几个月前我仍然可以使用它。
我的问题如下:
PS:我的浏览器版本是Google Chrome 70.0.3538.102(正式版本)(64位)
答案 0 :(得分:18)
我也遇到了这个错误,但发现它与Response状态无关,真正的问题是您只能消费一次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
}
,则会发生错误
如下所示:
<p>ehf ihiwef weoi</p>
答案 1 :(得分:17)
使用Response.clone()
克隆Response
示例
fetch('yourfile.json').then(res=>res.clone().json())
答案 2 :(得分:4)
我知道为时已晚,但是可以帮助某人:
let response = await fetch(targetUrl);
let data = await response.json();
答案 3 :(得分:2)
像“ json”,“ text”这样的响应方法可以被调用一次,然后锁定。 张贴的响应图像显示主体已锁定。 这意味着您已经称呼“ then”,“ catch”。要对此重做,您可以尝试以下操作。
fetch(url)
.then(response=> response.body.json())
.then(myJson=> console.log(myJson))
或
fetch(url)
.catch(response=> response.body.json())
.catch(myJson=> console.log(myJson))
答案 4 :(得分:1)
这对我有用
response.json().then(data => {
// use data
})
答案 5 :(得分:1)
fetch("xxxxxxxxxx")
.then(response => response.json())
.then(data => { console.log(data)})
.catch(error => { console.log(error)})
答案 6 :(得分:0)
我不小心重用了一个响应对象,类似于以下内容:
const response = await new ReleasePresetStore().findAll();
const json = await response.json();
this.setState({ releasePresets: json });
const response2 = await new ReleasePresetStore().findActive();
const json2 = await response.json();
this.setState({ active: json2 });
console.log(json2);
此行:
const json2 = await response.json();
应该是(response2而不是用尽的response1):
const json2 = await response2.json();
重用先前的响应没有任何意义,这是一个肮脏的代码错字...
答案 7 :(得分:0)
我也坚持了这一点。但这对我有用。
fetch(YOUR_URL)
.then(res => {
try {
if (res.ok) {
return res.json()
} else {
throw new Error(res)
}
}
catch (err) {
console.log(err.message)
return WHATEVER_YOU_WANT_TO_RETURN
}
})
.then (resJson => {
return resJson.data
})
.catch(err => console.log(err))
祝你好运
答案 8 :(得分:0)
正如问题中提到的,当您尝试使用相同的响应对象时,由于对象的状态,您的身体将被锁定。您可以做的是捕获响应对象的值,然后尝试对其进行一些操作(.then())。请按照下面的代码
fetch('someurl').then(respose) => {
let somedata = response.json(); // as you will capture the json response, body will not be locked anymore.
somedata.then(data) => {
{
error handling (if (data.err) { ---- })
}
{
operations (else { ---- })
}
}
}