2014-05-17 13 views
20

OK, muszę być gęsta, ponieważ nie mogę znaleźć nigdzie, jak uzyskać kody statusu błędów podczas korzystania z Node.JS http.get lub http.request. Mój kod:http uzyskać NodeJS jak uzyskać kod statusu błędu?

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

w tym "req.on" bit, co chcę jest kod stanu HTTP (czyli 401, 403, itd.). Dostaje się pół-bezużyteczny obiekt błędu, który nie daje mi kodu ani żadnego odniesienia do obiektu odpowiedzi. Próbowałem przechwytywać w callback funkcji (odpowiedzi), ale gdy istnieje 404, nigdy nie zostanie wywołana.

Dzięki!

+0

Czy próbowałeś response.statusCode? – radubogdan

Odpowiedz

33

Twoje oddzwonienie zostanie wywołane bez względu na kod stanu odpowiedzi z serwera, więc w ramach oddzwonienia, sprawdź response.statusCode. Oznacza to, że kod statusu 4xx nie jest error na poziomie, nad którym pracujesz; serwer odpowiedział, po prostu serwer odpowiedział, mówiąc, że zasób nie był dostępny (itp.).

To jest in the documentation, ale charakterystyczne niejasne. Oto przykład dają, z komentarzem wskazując na danym kawałku:

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

Jeśli spróbujesz, że z (powiedzmy) nieznanego źródła, zobaczysz statusCode: 404.

Więc co robisz, może chcesz coś takiego:

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

Hej, jakieś pomysły na wykonanie powtórzenia '(jeśli statusCode! = 200)' z poziomu odpowiedzi zwrotnej? –

+1

@sudosoul: Po prostu wstawiłbym całą rzecz do funkcji i jeśli chcesz spróbować ponownie, wywołaj tę funkcję z odpowiedzi zwrotnej. –

4

Odpowiedź 400 nie jest uważane za błąd przez node.js.

Wypróbuj kod response.statusCode w tym: request.on ('response', function (response) {});

1

Oto bardzo mały przykład jak uzyskać kod błędu. Wystarczy zmienić https do http i utworzyć błąd:

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); 
}); 
Powiązane problemy