【问题标题】:angularJS: custom 404 interceptor handle - response with urlangularJS:自定义 404 拦截器句柄 - 带有 url 的响应
【发布时间】:2015-05-15 16:03:20
【问题描述】:

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

并不总是有效。

【问题讨论】:

  • 通过 URL 检查逻辑听起来是错误的。似乎您应该为不同的拦截器行为提供不同的服务和/或服务方法,服务方法应该调用不同的拦截器,这些拦截器调用不同的错误解析器。其中一个错误解决程序应处理 404,另一个应忽略 404。服务方法应该决定这一点。将逻辑与 URL 的耦合听起来像是违反 SoC。
  • 能否分享完整的错误响应代码
  • @DaveAlperovich 你能提供我用不同拦截器的例子吗?
  • 为什么文章数组为空时服务器会返回 404?那不是以空数组作为返回的响应 200 吗?
  • @Claies 后端的开发方式很奇怪...

标签: javascript html angularjs


【解决方案1】:

来自documentation

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

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

【讨论】:

    【解决方案2】:

    在“响应”中,您应该检查响应 url,而不是 response.config.url.. 像这样:

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

    在响应级别,您没有config

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        所以... 我已经这样做了:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-06-15
            • 1970-01-01
            • 1970-01-01
            • 2022-07-02
            • 2018-09-27
            • 2012-08-11
            相关资源
            最近更新 更多