我试图创建一个方案来拦截和处理来自API中间件的请求,然而,无论出于何种原因,我无法正确处理来自我的API端点的非JSON响应。下面的片段对于JSON格式的服务器响应很好,但是假设用户有一个无效的令牌,服务器返回一个简单的Unauthorized Access响应,即使我向json()提供错误回调,我也无法处理它promise。在以下方案中,未授权访问响应消息丢失。
const callAPI = () => { fetch('http://127.0.0.1:5000/auth/', {
method: 'GET',
headers: {
'credentials': 'include',
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': 'Basic bXlKaGJHY2lPaUpJVXpJMU5pSXNJbVY0Y0NJNk1UUTVPRE15TVRNeU5pd2lhV0YwSWpveE5EazRNak0wT1RJMmZRLmV5SnBaQ0k2TVgwLllFdWdKNF9YM0NlWlcyR2l0SGtOZGdTNkpsRDhyRE9vZ2lkNGVvaVhiMEU6'
}
});
};
return callAPI().then(res => {
return res.json().then(responseJSON => {
if(responseJSON.status === 200){
return dispatch({
type: type[1],
data: responseJSON,
message: success
});
} else if(responseJSON.status === 401) {
return dispatch({
type: type[2],
message: responseJSON.message
});
}
return Promise.resolve(json);
}, (err) => {
console.log(err.toString(), ' an error occured');
});
}, err => {
console.log('An error occured. Please try again.');
});
字符串
3条答案
按热度按时间zwghvu4y1#
尝试使用Body:
res.text()
的文本方法。p1iqtdky2#
尝试将响应处理代码 Package 在
try...catch
块中,如下所示:字符串
Body.json()
在body实际上不是JSON时抛出。因此,您应该在调用json()
之前检查body是否包含JSON**。参见https://developer.mozilla.org/en-US/docs/Web/API/Response。p8ekf7hl3#
尝试使用
response.clone().json().catch(() => response.text())
,如下所述字符串
通过使用response.clone(),我们可以创建响应的副本以解析为JSON,如果失败,我们将原始响应解析为文本。
感谢 Steven Lambert 的文章JSON with Text Fallback和 Jake Archibald 的详细文章Reading responses