angularJS:自定义404拦截器句柄 - 使用url响应

时间:2015-03-13 08:26:57

标签: javascript html angularjs

在我的应用程序中,我使用拦截器来捕获所有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?因为:

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

并不总是有效。

5 个答案:

答案 0 :(得分:3)

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

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

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

}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

在"响应"你应该检查响应网址,而不是response.config.url .. 像这样的东西:

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

在响应级别,您没有config

答案 3 :(得分:1)

...这样 我这样做了:

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

答案 4 :(得分:-1)

来自documentation

  

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

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