2017-09-15 224 views
2

使用fetchApi我发出POST请求端点和捕捉错误是这样的:HTTP请求错误代码429不能被捕获

fetch(new Request(url, { 
    method: 'POST', 
    headers: { ...defaultHeaders, ...headers } , 
    credentials: 'include', 
    body: JSON.stringify(body) 
})).then(
    // handle correct reponse 
).catch(
    if (err.status === 401) { 
     // handle error nicely 
    } else if (err.status === 429) { 
     // handle error differently 
    } else { 
     // handle error yet another way 
    } 
); 

虽然如预期的那样处理401错误,当端点与429的响应代码

else if (err.status === 429) { 
     // handle error differently 
    } 

永远不会执行。

EDIT1:永远不会在429

情况下达到整个Catch这些401个429状态码由JavaScript /浏览器处理方式不同? 如何捕获429错误并按我的方式处理?

+1

在所有执行'catch'?那么你是否调试过'err.status'是否真的是'* 429'? – deceze

+0

捕获在401状态代码的情况下执行,但在429的情况下根本不执行。我知道它确实是429,因为错误记录在浏览器的JS控制台中。 –

+1

好的,所以问题不在于'else if'不匹配,而是'fetch'不会拒绝承诺,对吧? – deceze

回答

3

看起来大多是错误的期望。当答复的type"error"时,该承诺只会被拒绝(因此调用catch),这似乎只适用于非常特定的有限情况。

Per MDN,该fetch() API只是拒绝一个时承诺“遇到网络错误,虽然这通常意味着权限问题或相似的。”基本上fetch()将只有当用户离线拒绝承诺或一些不太可能发生网络错误,例如DNS查找失败。

换句话说,具有429响应的请求仍然是成功执行的请求。

好消息是获取提供了一个简单的ok标志,指示HTTP响应的状态码是否在成功范围内。

fetch("http://httpstat.us/500") 
    .then(function(response) { 
     if (!response.ok) { 
      throw Error(response.statusText); 
     } 
    }) 

https://www.tjvantoll.com/2015/09/13/fetch-and-errors/