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