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