Javascript 获取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(数

我想显示API中的错误消息,问题是如果我检查
响应,我就无法到达该错误。好的
,它返回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);
        }
    });