web-dev-qa-db-fra.com

http get NodeJS comment obtenir le code d'état d'erreur?

OK, je dois être dense car je ne trouve nulle part comment obtenir les codes d'état d'erreur lors de l'utilisation de Node.JS http.get ou http.request. Mon code:

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

Dans ce bit "req.on", ce que je veux, c'est le code d'état http (c'est-à-dire 401, 403, etc.). Ce que j'obtiens est un objet d'erreur semi-inutile qui ne me donne pas le code ou aucune référence à l'objet de réponse. J'ai essayé d'intercepter dans le rappel de fonction (réponse), mais quand il y a un 404, il n'est jamais appelé.

Merci!

28
user3647766

Votre rappel est appelé quel que soit le code d'état de réponse du serveur. Dans votre rappel, vérifiez response.statusCode. Autrement dit, un code d'état 4xx n'est pas une erreur au niveau où vous travaillez; le serveur a répondu, c'est juste que le serveur a répondu en disant que la ressource n'était pas disponible (etc.)

C'est dans la documentation mais typiquement vague. Voici l'exemple qu'ils donnent, avec un commentaire pointant sur le bit pertinent:

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

Si vous essayez cela avec (disons) une ressource inconnue, vous verrez statusCode: 404.

Donc, pour ce que vous faites, vous voudrez peut-être quelque chose comme ceci:

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

Une réponse de code d'erreur 400 n'est pas considérée comme une erreur par node.js.

Essayez response.statusCode dans ce:

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

Voici un tout petit exemple comment obtenir le code d'erreur. Modifiez simplement https en http et créez une erreur:

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