无法捕获 HTTP 请求错误代码 429

Pio*_*ski 3 javascript http fetch-api

使用fetchApi我向端点发出 POST 请求并捕获如下错误:

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
    }
);
Run Code Online (Sandbox Code Playgroud)

虽然 401 错误按预期处理,但当端点以 429 响应时,代码

else if (err.status === 429) {
       // handle error differently
    } 
Run Code Online (Sandbox Code Playgroud)

永远不会被执行。

EDIT1:在 429 的情况下永远不会达到整个捕获

javascript/浏览器对 401 和 429 状态代码的处理方式不同吗? 如何捕获 429 错误并按我的方式处理?

dec*_*eze 7

看起来大多是错误的期望。承诺只会catch在响应type为时被拒绝(并因此被调用)"error",这似乎仅适用于非常具体的有限情况。

根据 MDNfetch()API 仅在“遇到网络错误时拒绝承诺,尽管这通常意味着权限问题或类似问题”。基本上fetch()只会在用户离线时拒绝承诺,或者发生一些不太可能的网络错误,例如 DNS 查找失败。

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

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

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

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