Javascript 获取API错误处理
我想显示API中的错误消息,问题是如果我检查Javascript 获取API错误处理,javascript,reactjs,error-handling,fetch,Javascript,Reactjs,Error Handling,Fetch,我想显示API中的错误消息,问题是如果我检查响应,我就无法到达该错误。好的,它返回Fetch error,而不是API中的错误 如果我不使用If(response.ok).它会从API返回错误,但会发送成功操作 以下是登录操作示例: export const signIn=data=>dispatch=>{ 调度({ 类型:登录 }) 获取(API_URL+'/login',{ 方法:“POST”, 标题:{ “内容类型”:“应用程序/json” }, 正文:JSON.stringify(数
响应,我就无法到达该错误。好的
,它返回Fetch error,而不是API中的错误
如果我不使用If(response.ok).
它会从API返回错误,但会发送成功操作
以下是登录操作示例:
export const signIn=data=>dispatch=>{
调度({
类型:登录
})
获取(API_URL+'/login',{
方法:“POST”,
标题:{
“内容类型”:“应用程序/json”
},
正文:JSON.stringify(数据),
})
。然后(响应=>{
如果(!response.ok){throw response}
return response.json()//我们只有在没有错误的情况下才能到达这里
})
。然后(json=>{
派遣({
类型:登录成功,有效负载:json
}),
setItem(“token”,“Bearer”+json.token)
setItem(“user”,JSON.stringify(JSON.user))
})
.catch(错误=>{
派遣({
类型:登录失败,有效负载:错误
})
})
}
根据:
,则fetch()
API仅在以下情况下拒绝承诺:
“网络
遇到错误,但这通常意味着权限问题
或类似的。”
基本上,fetch()
处于脱机状态,或者发生一些不太可能的网络错误,例如DNS
查找失败
然后,您可以使用这部分代码来使用非网络错误处理,并使代码更具可读性
function handleErrors(response) {
if (!response.ok) throw new Error(response.status);
return response;
}
fetch("API URL")
// handle network err/success
.then(handleErrors)
// use response of network on fetch Promise resolve
.then(response => console.log("ok") )
// handle fetch Promise error
.catch(error => console.log(error) );
为了在出现错误时从服务器中提取API消息,您必须使用以下习惯用法(虽然它并不存在于表面上),请参阅
冗长-是的!,但这正是我们所需要的。通过以下解决方案,我们可以处理JSON API错误、通用API错误和通用获取错误
fetch("api/v1/demo", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"data": "demo"
})
})
.then(response => {
if (!response.ok) {
return Promise.reject(response);
}
return response.json();
})
.then(data => {
console.log("Success");
console.log(data);
})
.catch(error => {
if (typeof error.json === "function") {
error.json().then(jsonError => {
console.log("Json error from API");
console.log(jsonError);
}).catch(genericError => {
console.log("Generic error from API");
console.log(error.statusText);
});
} else {
console.log("Fetch error");
console.log(error);
}
});
您应该在catch块中获得该错误。你能展示你的err
对象吗?试试这个它没有回答问题(@AndreasGelever Yes!!!我不知道为什么这个答案得到了三个+1:D,但它本身有一个间接答案;抛出错误(response.status)
应该是抛出新错误(response.status)
不起作用。它告诉我:“error.json不是函数”
fetch("api/v1/demo", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"data": "demo"
})
})
.then(response => {
if (!response.ok) {
return Promise.reject(response);
}
return response.json();
})
.then(data => {
console.log("Success");
console.log(data);
})
.catch(error => {
if (typeof error.json === "function") {
error.json().then(jsonError => {
console.log("Json error from API");
console.log(jsonError);
}).catch(genericError => {
console.log("Generic error from API");
console.log(error.statusText);
});
} else {
console.log("Fetch error");
console.log(error);
}
});