Подтвердить что ты не робот

Http получить NodeJS, как получить код состояния ошибки?

ОК, я должен быть плотным, так как не могу найти, как получить коды состояния ошибок при использовании 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 и т.д.). Я получаю полуполезный объект ошибки, который не дает мне кода или ссылки на объект ответа. Я попытался перехватить обратный вызов функции (ответа), но когда есть 404, он никогда не будет вызван.

Спасибо!

4b9b3361

Ответ 1

Обратный вызов вызывается независимо от кода состояния ответа с сервера, поэтому в своем обратном вызове отметьте response.statusCode. То есть код состояния 4xx не является ошибкой на уровне, на котором вы работаете; сервер ответил, это просто, что сервер ответил, сказав, что ресурс недоступен (и т.д.)

Это в документации, но характерно неопределенный. Вот пример, который они дают, с комментарием, указывающим на соответствующий бит:

var https = require('https');

https.get('https://encrypted.google.com/', function(res) {
  console.log("statusCode: ", res.statusCode); // <======= Here 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]...*/);
});

Ответ 2

Ответ с кодом ошибки 400 не считается ошибкой для node.js.

Попробуйте response.statusCode в этом:

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

Ответ 3

Вот очень маленький пример того, как получить код ошибки. Просто измените https на http и создайте ошибку:

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