2017-09-15 7 views
2

을 잡은 할 수 없습니다 예상대로 엔드 포인트가 429로 응답 할 때 401 오류가 처리됩니다HTTP 요청 오류 코드 429은 내가 엔드 포인트에 POST 요청을 발행하고이 같은 오류를 잡기하고 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API" rel="nofollow noreferrer">fetchApi</a>를 사용

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 
    } 
); 

동안 코드

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

절대로 실행되지 않습니다.

EDIT1 : 전체 캐치는

(429)의 경우에는 도달하지 않습니다 401 개 및 429 상태 코드는 자바 스크립트/브라우저에서 다르게 처리하고 있습니까? 어떻게 429 오류를 잡아 내 방식으로 처리 할 수 ​​있습니까?

+1

전혀 실행'catch'인가? 그런 다음'err.status'가 * 정말로 정확히'429'인지 여부를 디버깅 해 보셨습니까? – deceze

+0

catch는 401 상태 코드의 경우에 실행되지만 429의 경우에는 전혀 실행되지 않습니다. 오류가 브라우저의 JS 콘솔에 기록되기 때문에 catch가 실제로 429입니다. –

+1

OK, 문제는 'else if'가 일치하지 않는다는 것이지,'fetch'가 약속을 거부하지 않는다는 것입니다, 그렇습니까? – deceze

답변

3

대부분은 잘못된 기대처럼 보입니다. 응답의 type"error" 일 때만 약속이 거부되며 (따라서 catch이 호출 됨) 매우 제한적인 경우에만 해당됩니다.

Per MDN

fetch() API 만 약속 거부 "이 일반적으로 사용 권한 문제 또는 유사한 것을 의미하지만, 네트워크 오류가 발생됩니다."는 기본적으로 fetch()는 사용자가 오프라인 인 경우 약속을 거부하거나 일부에만 것 DNS 조회 실패와 같은 네트워크 오류가 발생하지 않습니다.

즉, 429 응답의 요청은 여전히 ​​성공적으로 실행 된 요청입니다.

news is fetch는 HTTP 응답의 상태 코드가 성공적인 범위에 있는지 여부를 나타내는 간단한 ok 플래그를 제공합니다.

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/