2017-09-15 222 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/