AngularJS: пользовательская рукоятка перехватчика 404 - ответ с URL-адресом

В моем приложении я использую перехватчик, чтобы поймать все ошибки HTTP-ответа, например:

var response = function(response) {
  if(response.config.url.indexOf('?page=') > -1) {
    skipException = true;
  }
  return response;
}

var responseError = function(rejection) {
  if (rejection.status === 401 || rejection.status === 403) {
    /**/
  }
  else if (rejection.status >= 500 || rejection.status === 0) {
    /**/
  }
  else if (rejection.status === 404 && !skipException) {
    /**/
  }
  else if (rejection.status === 404 && skipException) {
    /**/
  }
  else{
    /**/
  }
  return $q.reject(rejection);
};

И когда я иду на свой контроллер (когда мой метод getArticles возвращает некоторые данные, а не 404 - когда массив статей пуст), все в порядке: поймано 404 с skipException == true.

Но когда мой массив статей пуст, сервер возвращает 404, и когда я вхожу в этот контроллер, я не могу получить response.config.url - никакой ответ не пойман, но почему? Я думал, что перехватчик поймает все ответы.

    $timeout(function() {
      $scope.getArticles();
    }, 100);

и $scope.getArticles имеет такой код:

getDataService.getArticles($scope.pageNum).then(function(response) {
 /**/
});

службы:

var getEventsByScrollService = function(num) {
  var deferred = $q.defer();
  $http.get(***, {

    })
    .success(function(response) {
      deferred.resolve(response);
    }).error(function(err, status) {
      if (status === 404){
        deferred.resolve([]);
      }
      else{
        deferred.reject(err);
      }
    });
  return deferred.promise;
};

Как я могу условно уловить 404 в зависимости от URL? Потому что это:

if(response.config.url.indexOf('?page=') > -1) { 

Не всегда работает.

Ответы

Ответ 1

так... я сделал это так:

    if(rejection.config.url.indexOf('?page=') > -1) {
      skipException = true;
    }

Ответ 2

вы можете проверить Restangular, может быть полезно для ваших целей. У этого есть хорошие методы перехватчика, встроенные. Будет ли это действительно хорошо для Вас, будет зависеть от того, используете ли вы RESTful API или нет. https://github.com/mgonto/restangular

Ответ 3

В целях обеспечения большей поддержки и расширения для любого вызова службы $http это можно сделать:

// Service call
$http.get({url:'/?page=', ignoreErrors: true})

// Interceptor
if(rejection.status === 404 && !rejection.config.ignoreErrors) {

}

Ответ 4

В "ответе" вы проверяете ответный url, а не response.config.url.. что-то вроде этого:

var response = function(response) {
    if(response.url.indexOf('?page=') > -1) {
        skipException = true;
    }
  return response;
}

на уровне ответа у вас нет config

Ответ 5

Из документации:

Код состояния ответа от 200 до 299 считается успешным статус и вызовет вызов обратного вызова успеха.

Так как сервер возвращает 404, функция responseError вызывается. К сожалению, параметр конфигурации недоступен, поэтому вы не можете выполнять условную логику на основе URL-адреса запроса.