Http obtenir 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.-à-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 la fonction (réponse), mais quand il y a un 404, il ne se fait jamais appel.

Merci!

Votre rappel est appelé indépendamment du code d'état de réponse du serveur, donc dans votre rappel, vérifiez response.statusCode . Autrement dit, un code d'état 4xx n'est pas une erreur au niveau auquel 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.)

Ceci est dans la documentation mais typiquement vague. Voici l'exemple qu'ils donnent, avec un commentaire indiquant 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 avec (disons) une ressource inconnue, vous verrez statusCode: 404 .

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

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

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

Essayez response.statusCode dans ceci: request.on ('response', function (response) {});

Voici un petit exemple pour obtenir le code d'erreur. Modifiez simplement la https à 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); });