我正在使用Fetch API加载一些JSON。因此,我在响应流上使用.json()
,在.then()
中使用可选的第二个函数参数(onRejected
),它只有一个参数,即拒绝原因。
如果出现问题(例如响应没有有效的JSON),我希望访问原始响应文本以获得一些有意义的错误日志或进一步处理意外响应。
考虑这个简化的代码段:
fetch('api.php')
.then(
response => { return response.json(); }
)
.then(
json => { /* useful fulfillment value, a JSON object */ },
reason => { /* string message only */ }
);
如果API使用有效JSON之外的其他内容进行响应,它将拒绝,原因如下:
SyntaxError:JSON.parse:JSON数据第1行第1列的意外字符
虽然这是一个非常清晰的错误消息,但它没有实际导致错误的转储。
我考虑使用.text()
,然后尝试自己解析JSON,但这有点违反.json()
的目的。
如果拒绝流阅读,是否有合理的方式来访问响应文本?
答案 0 :(得分:0)
让我们说这很讨厌,但可以解决问题:
let res;
fetch('api.php')
.then(
response => { res = response; return response.json(); }
)
.then(
json => { /* useful fulfillment value, a JSON object */ },
reason => { /* use res variable */ }
);
答案 1 :(得分:0)
如果响应肯定有一个正文,那么使用response.text()方法读取文本(如其他答案或其他地方所示:MDN,Google Web)然后自己解析或者在任何附加条件或检查之后(是JSON吗?检查然后使用JSON.parse)。
使用正文不是一般处理错误的有效方法。如果API没有包含正文,或者它的格式错误,或者请求完全失败,会发生什么?而是查看response.statusText
(例如'未找到。'),response.status
(例如404)和其他标头。或者,如果提取失败,则响应将是Error
个error.message
和error.stack
的对象。如果您拥有API并需要更复杂/可预测的消息,请考虑添加自定义标头,例如' special-message'并使用类似if(response.headers) response.headers.get('special-message')
的内容检索它。
只有在这些其他情景不是一个问题的情况下才能与身体一起工作以获得更多的可预测性。在完成任何流式传输之前,上述标题也可用,以进一步简化和改进响应性和响应处理。