2017-03-06 1 views
0

이것은 Promises의 남용과 같을 수도 있지만 여기서는 나의 사용 사례입니다.HTTP 503 응답이 Promise를 거부하지 못하도록 함

OAS (Swagger) 파일에 저장된 API 정의의 유효성을 검사하기 위해 NodeJS 기반 도구를 작성하고 있습니다. 이 태스크에는 "호스트"및 "기본 경로"특성을 "경로"특성에 나열된 각 엔드 포인트 이름과 연결하여 구성된 엔드 포인트의 유효성 검사가 포함됩니다.

내가이 줄

var request = require('request') 
 
var Promise = require('promise') 
 

 
// Wrap the HTTP HEAD request in a promise 
 
request.head = Promise.denodeify(request.head)

난 때문에가 HTTP HEAD 요청을 사용하고 있습니다를 사용하여 표준 '요청'라이브러리를 포장하기 위해 NodeJS 라이브러리 '약속'을 사용하고 있습니다 실제로 API를 호출하는 것에는 관심이 없습니다. OAS 파일에 표시된 URL이 유효한 대상을 가리키는 지 확인하고 싶습니다.

즉, 404 (찾을 수 없음) 및 410 (사용하지 않음)을 제외한 거의 모든 응답 상태 코드를 사용할 수 있습니다.

그러나 HTTP 503 (서비스를 사용할 수 없음) 응답 인 경우 'request'NodeJS 라이브러리는 이것을 오류로보고하고 이로 인해 request.head() 호출을 거절하는 Promise가 거부됩니다.

API를 구현할 수있는 방법이 다양하기 때문에 확인중인 URL 뒤에있는 API 관리 레이어가 HTTP HEAD 요청을 명시 적으로 차단하려는 경우 HTTP 503 대신 응답으로 응답 할 수 있습니다. 더 많은 HTTP 405 (Method not allowed)가 필요합니다. 또한 API가 샌드 박싱 된 경우 HTTP 503이 예상 상태 코드입니다.

어쨌든 HTTP 503은 잠재적으로 허용되지 않는 HTTP 메서드를 사용하여이 URL을 호출했지만이 URL이 실제로 유효 함을 보여줍니다.

"약속 안함"은 남용 (아마도 불가능할 수도 있음)이라고 생각합니다. 따라서 HTTP 요청을 직접 처리해야 할 수있는 가능성이 남습니다. 503은 오류로 간주되지 않습니다.

누구나 더 좋은 아이디어가 있습니까?

덕분에

크리스 W

답변

0

나는 "unrejecting"생각은 약속

는 "Unrejecting"약속이 실제로 불가능하다, 남용 (그리고 아마도 불가능)입니다. 상태를 바꿀 수있는 유일한 방법은 .then() 또는 .catch()으로 약속 체인을 만들고 콜백에서 적절한 반환 (또는 던지기)을 수행하는 것입니다.

그래서 나는 503이 오류로 간주되지 않는 방식으로 HTTP 요청을 직접 처리해야 할 가능성이 남습니다.

아마도 가장 현실적인 방법 일 것입니다. 즉, 맞춤 주문 된 request.head()의 약속입니다.

문제는 잘못된 코드 목록 (404 및 410)을 나타내므로 해당 코드가 발견 된 경우에만 거부하기가 더 쉽습니다.

function testUrl(url) { 
    const badCodes = [404, 410]; 
    return new Promise((resolve, reject) => { 
     request.head(url, (error, response, body) => { 
      if(error) { 
       if(response && badCodes.indexOf(+response.statusCode) === -1) { 
        resolve(response.statusCode); 
       } else { 
        reject error; 
       } 
      } else { 
       resolve(response.statusCode); 
      } 
     }); 
    }); 
} 

또는 허용 할 오류 코드 목록이 짧으면 테스트 논리가 쉽게 반전됩니다.

function testUrl(url) { 
    const goodCodes = [503]; 
    return new Promise((resolve, reject) => { 
     request.head(url, (error, response, body) => { 
      if(error) { 
       if(response && goodCodes.indexOf(+response.statusCode) > -1) { 
        resolve(response.statusCode); 
       } else { 
        reject(error); 
       } 
      } else { 
       resolve(response.statusCode); 
      } 
     }); 
    }); 
} 

원하는대로 정확하게 재생할 수 있습니다. 당신이 결국 무엇이든

, 전화 :

testUrl('http://path/to/resource').then(function(statusCode) { 
    // pass 
}, function(error) { 
    // fail 
}); 
+0

좋아요, 감사 그것에 대해 많이. –

관련 문제