reactjs - 当 API 返回任何错误时,catch 块不会被触发
问题描述
我正在进行正常的 API 调用,但由于某种原因,console.log(err)
当我收到 500 错误时,我在 catch 块中看不到。它总是在我的 then 块中触发console.log(result)
我做错了什么?
const startHandler = () => {
setOpenLoadingModal(true);
fetch(url, {
method: 'post',
body: JSON.stringify(payload),
headers: headers,
})
.then((response) => response.json())
.then((result) => {
console.log(" ~ file: index.js ~ line 159 ~ .then ~ result", result)
const { client_id, token } = result;
if (!token || !client_id){
setOpenErrorModal(true);
return setOpenLoadingModal(false);
} else{
return history.push({
pathname: FORMS_URL.LANDING_PAGE,
});
})
.catch((err) => {
console.log(err)
setOpenErrorModal(true);
setOpenLoadingModal(false);
});
};
解决方案
fetch
不拒绝 4xx/5xx 错误状态
即使响应是 HTTP 404 或 500,返回的 Promise
fetch()
也不会拒绝 HTTP 错误状态。 相反,只要服务器响应标头,Promise 就会正常解析(响应的 ok 属性设置为 false如果响应不在 200-299 范围内),它只会在网络故障或任何阻止请求完成的情况下拒绝。
你应该检查response.ok
状态。
const startHandler = () => {
setOpenLoadingModal(true);
fetch(url, {
method: 'post',
body: JSON.stringify(payload),
headers: headers,
})
.then((response) => {
if (!response.ok) { // <-- check response OK here
throw new Error('Network response was not ok');
}
return response.json();
})
.then((result) => {
console.log(" ~ file: index.js ~ line 159 ~ .then ~ result", result)
const { client_id, token } = result;
if (!token || !client_id){
setOpenErrorModal(true);
return setOpenLoadingModal(false);
} else{
return history.push({
pathname: FORMS_URL.LANDING_PAGE,
});
})
.catch((err) => {
console.log(err)
setOpenErrorModal(true);
setOpenLoadingModal(false);
});
};
推荐阅读
- typescript - Vue 路由器只显示一个组件
- c# - 在 xamarin 项目 System.InvalidCastException:“指定的演员表无效。”
- python - Echo 服务器聊天应用程序有连接问题
- python - 从拆分命令管道输出到另一个函数
- ruby-on-rails - 预加载与记录子集的 has_many 关联
- apache-spark - 理解一个窗口函数的例子
- go - 当有未知数量的输入时如何关闭通道?
- sql - SQL - 按月计算订单数量的差异
- java - 如何使用多个消费者来消费来自多个 SQS 队列的消息?
- libreoffice-calc - 如何使用 =sheet() 值中的内部参考号来参考 Libreoffice 计算表