HTTP请求错误代码429不能被捕获
问题描述:
使用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错误并按我的方式处理?
答
看起来大多是错误的期望。当答复的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); } })
在所有执行'catch'?那么你是否调试过'err.status'是否真的是'* 429'? – deceze
捕获在401状态代码的情况下执行,但在429的情况下根本不执行。我知道它确实是429,因为错误记录在浏览器的JS控制台中。 –
好的,所以问题不在于'else if'不匹配,而是'fetch'不会拒绝承诺,对吧? – deceze