AngularJS:自定义 404 拦截器句柄 - 带有 URL 的响应

angularJS: custom 404 interceptor handle - response with url

本文关键字:带有 URL 响应 句柄 自定义 AngularJS      更新时间:2023-09-26

在我的应用程序中,我使用拦截器来捕获所有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 - 当文章数组为空时),一切都很好:捕获了带有 skipException == true 的 404。

但是当我的文章数组为空时,服务器返回 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;
};

如何根据 URL 有条件地捕获 404? 因为这个:

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

并不总是有效。

为了

更好地维护和扩展到任何$http服务调用,可以这样做:

// Service call
$http.get({url:'/?page=', ignoreErrors: true})
// Interceptor
if(rejection.status === 404 && !rejection.config.ignoreErrors) {
}
您可以查看

Restangular,可能对您的目的有用。 它内置了良好的拦截器方法。 它是否真的对你有好处将取决于你是否使用RESTful API。https://github.com/mgonto/restangular

在"响应"中,您应该检查响应网址,而不是response.config.url。像这样:

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

在响应级别,您没有config

所以...我已经做到了:

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

从文档中:

介于 200 和 299 之间的响应状态代码被视为成功 状态,并将导致调用成功回调。

由于服务器返回 404,因此调用 responseError 函数。不幸的是,config 参数不可用,因此您无法根据其中的请求 url 执行任何条件逻辑。