2014-05-17 4 views
20

ОК, я должен быть плотным, так как я не могу найти нигде, как получить коды состояния ошибок при использовании Node.JS http.get или http.request. Мой код:http get NodeJS как получить код состояния ошибки?

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, он никогда не вызывается.

Спасибо!

+0

ли вы пробовали response.statusCode? – radubogdan

ответ

33

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

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

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]...*/); 
}); 
+0

Эй, какие-нибудь идеи о том, как выполнить повтор '(if statusCode! = 200)', изнутри обратного вызова ответа? –

+1

@sudosoul: Я бы просто поместил все это в функцию и, если вы хотите повторить попытку, вызовите эту функцию из обратного вызова ответа. –

4

A 400 ответа не считается ошибкой по Node.js.

Попробуйте response.statusCode в этом: request.on ('response', function (response) {});

1

Вот очень маленький пример того, как получить код ошибки. Просто измените 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); 
}); 
Смежные вопросы