Your callback gets called regardless of the response status code from the server, so within your callback, check response.statusCode
. That is, a 4xx status code isn’t an error at the level you’re working at; the server responded, it’s just that the server responded by saying the resource wasn’t available (etc.)
This is in the documentation but characteristically vague. Here’s the example they give, with a comment pointing to the relevant bit:
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);
});
If you try that with (say) an unknown resource, you’ll see statusCode: 404
.
So for what you’re doing, you may want something like this:
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
response.on("data", function() { } ); // ¹
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]...*/);
});
¹ The empty data
event handler in the branch handling non-OK status codes is there because of this note in the documentation:
…if a
'response'
event handler is added, then the data from the response object must be consumed, either by callingresponse.read()
whenever there is a'readable'
event, or by adding a'data'
handler, or by calling the.resume()
method. Until the data is consumed, the'end'
event will not fire. Also, until the data is read it will consume memory that can eventually lead to a ‘process out of memory’ error.
Since we’re passing a function to https.get
, we’re hooking the 'response'
event, which suggests we need to do one of those things (in this case, I’ve added a do-nothing data
handler). Thanks to Nicolas2bert for pointing that out!.