2017-03-06 11 views
0

これはPromisesの悪用のように聞こえるかもしれませんが、私の使用例です。HTTP 503応答がプロミスを拒否するのを防ぐ

私はOAS(Swagger)ファイルに保存されているAPI定義を検証するNodeJSベースのツールを作成しています。このタスクの一部は、「ホスト」プロパティーと「ベースパス」プロパティーを「paths」プロパティーにリストされている各エンドポイント名と連結して構成されたエンドポイントの妥当性を検査することです。

私はこのライン

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 503で応答することができます予想されるHTTP 405(メソッドが許可されていない)。また、APIがサンドボックス化されている場合は、HTTP 503が予期されるステータスコードになります。

どちらの方法でも、HTTP 503は、このURLが実際には有効であることを示していますが、これはおそらく許可されていないHTTPメソッドを使用して呼び出されました。

「プロミスを拒否する」とは、悪用(おそらく不可能)だと思うので、私はHTTPリクエストを自分で処理しなければならない可能性が残っています。

誰でも良いアイデアがありますか?

おかげ

クリス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

グレート、そのためのおかげで多くのことを。 –

関連する問題