我在前端和后端 (NodeJS) 都使用 Fetch API,在将响应解析为 json 时,我经常遇到这个问题。
response.json()
将返回一个承诺,所以我事先不知道响应的主体是什么,当主体为空时,JSON 解析将失败并出现错误:
SyntaxError: Unexpected end of input
所以我的问题是,如何防止在响应为空时解析响应?
谢谢
原文由 Beldar 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在前端和后端 (NodeJS) 都使用 Fetch API,在将响应解析为 json 时,我经常遇到这个问题。
response.json()
将返回一个承诺,所以我事先不知道响应的主体是什么,当主体为空时,JSON 解析将失败并出现错误:
SyntaxError: Unexpected end of input
所以我的问题是,如何防止在响应为空时解析响应?
谢谢
原文由 Beldar 发布,翻译遵循 CC BY-SA 4.0 许可协议
由于 response.json()
返回一个 Promise,您可以使用 catch
处理错误并返回一个虚拟数据对象。
fetch('url').then(response => {
return response.json().catch(err => {
console.error(`'${err}' happened, but no big deal!`);
return {};
});
}).then(data => {
console.log(data);
});
如下所述,如果您尝试读取 response
两次,您将收到错误: TypeError: Already Read
。
作为解决方法,您可以 clone
原始响应并在克隆对象上调用 json
。
fetch('url').then(response => {
const responseCopy = response.clone();
return responseCopy.json().catch(_ => response.text());
}).then(data => {
console.log(data);
});
原文由 Роман Парадеев 发布,翻译遵循 CC BY-SA 3.0 许可协议
13 回答12.8k 阅读
7 回答1.9k 阅读
3 回答2.6k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
6 回答822 阅读✓ 已解决
6 回答1k 阅读
获得
Response
对象后,检查标头并查看Content-Length
说的内容。基于此,您可以知道是否有要解析的内容。而且,服务器返回application/json
空资源似乎是假的,因为它不是 JSON。