Ответ 1
Обратный вызов вызывается независимо от кода состояния ответа с сервера, поэтому в своем обратном вызове отметьте response.statusCode
. То есть код состояния 4xx не является ошибкой на уровне, на котором вы работаете; сервер ответил, это просто, что сервер ответил, сказав, что ресурс недоступен (и т.д.)
Это в документации, но характерно неопределенный. Вот пример, который они дают, с комментарием, указывающим на соответствующий бит:
var https = require('https');
https.get('https://encrypted.google.com/', function(res) {
console.log("statusCode: ", res.statusCode); // <======= Here the status code
console.log("headers: ", res.headers);
res.on('data', function(d) {
process.stdout.write(d);
});
}).on('error', function(e) {
console.error(e);
});
Если вы попробуете это с (скажем) неизвестным ресурсом, вы увидите statusCode: 404
.
Итак, для того, что вы делаете, вам может понадобиться что-то вроде этого:
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]...*/);
});