web-dev-qa-db-ja.com

http NodeJSを取得して、エラーステータスコードを取得する方法は?

OK、Node.JS http.getまたはhttp.requestを使用するときにエラーステータスコードを取得する方法がどこにも見つからないので、私は密集している必要があります。私のコード:

    var deferred = $q.defer();

    var req = https.get(options, function(response){
        var str = '';
        response.on('data', function (chunk) {
            str += chunk;
        });
        response.on('end', function () {
            console.log("[evfService] Got user info: "+str);
            deferred.resolve(str);
        });


    });

    req.on('error', function(e){
       deferred.reject(e);
    });

その「req.on」ビットでは、httpステータスコード(つまり、401、403など)が必要です。私が取得するのは、コードや応答オブジェクトへの参照を提供しない、ほとんど役に立たないエラーオブジェクトです。 function(response)コールバックでインターセプトを試みましたが、404がある場合は呼び出されません。

ありがとう!

28
user3647766

サーバーからの応答ステータスコードに関係なくコールバックが呼び出されるため、コールバック内でresponse.statusCode。つまり、4xxステータスコードは、作業中のレベルではerrorではありません。サーバーが応答しました。リソースが利用できないと言ってサーバーが応答しただけです(など)

これは ドキュメントでは ですが、特徴的にあいまいです。関連するビットを指すコメントとともに、彼らが与える例を示します:

var https = require('https');

https.get('https://encrypted.google.com/', function(res) {
  console.log("statusCode: ", res.statusCode); // <======= Here's the status code
  console.log("headers: ", res.headers);

  res.on('data', function(d) {
    process.stdout.write(d);
  });

}).on('error', function(e) {
  console.error(e);
});

(たとえば)未知のリソースを使用して試してみると、statusCode: 404

だからあなたがやっていることのために、あなたはこのようなものが欲しいかもしれません:

var deferred = $q.defer();

var req = https.get(options, function (response) {
    var str = '';

    if (response.statusCode < 200 || response.statusCode > 299) { // (I don't know if the 3xx responses come here, if so you'll want to handle them appropriately
        deferred.reject(/*...with appropriate information, including statusCode if you like...*/);
    }
    else {
        response.on('data', function (chunk) {
            str += chunk;
        });
        response.on('end', function () {
            console.log("[evfService] Got user info: " + str);
            deferred.resolve(str);
        });
    }
});

req.on('error', function (e) {
    deferred.reject(/*...with appropriate information, but status code is irrelevant [there isn't one]...*/);
});
40
T.J. Crowder

エラーコード400の応答は、node.jsではエラーとは見なされません。

response.statusCodeこの中:

request.on('response', function (response) {}); 
9

エラーコードを取得する方法の非常に小さな例を次に示します。 httpshttpに変更してエラーを作成するだけです:

var https = require('https')
var username = "monajalal3"
var request = https.get("https://teamtreehouse.com/" + username +".json", function (response) {
    console.log(response.statusCode);
});

request.on("error", function (error) {
    console.error(error.status);
});
5
Mona Jalal