$http拦截器导致无限循环

3

我正在构建一个与自定义API配合的AngularJs应用程序,后者需要有效的授权令牌,否则我的API会返回4O1 HTTP状态码。

因此,我使用了一个HTTP拦截器,旨在在重试之前请求一个新的令牌。

    app.factory('httpResponseErrorInterceptor', ['$q', '$injector', function($q, $injector, $http) {
    return {
        'responseError': function(response) {
            if (response.status === 401) {
                // should retry
                let deferred = $q.defer();
                let $http = $injector.get('$http');
                $.ajax({
                    url        : PUBLIC_API_URI,
                    type       : 'HEAD',
                    beforeSend : function(request) {
                        request.setRequestHeader('Authorization', api_access_key);
                    },
                    success    : function(result, status, xhr) {
                        console.log("error -> ok : should retry");
                        deferred.resolve(xhr.getResponseHeader('Authorization'));
                    },
                    error      : function(xhr, status, error) {
                        console.log("error -> bad : should give up");
                        deferred.resolve(null);
                    }
                });
                console.log(deferred.promise);
                if(deferred.promise == null)
                    return $q.reject(response);
                response.config['Authorization'] = api_access_key = deferred.promise;
                return $http(response.config);
            }

            return $q.reject(response);
        }
    };
}]);

我在拦截器中使用了JQuery.ajax,因为我猜测使用$http会导致令牌续订请求出错时出现无限循环。但是,即使出现错误,它仍然会导致无限循环:原始请求 -> 续订请求...

1个回答

2
我没有看到完整的错误日志,但我猜问题可能与在http拦截器中注入$http服务有关(即使您正在使用$.ajax也仍然存在)。这会导致循环依赖,因为Angular将尝试解决$ http和拦截器的依赖关系而面临无限循环。
请参见我的先前答案 此处 如果需要进行AJAX调用,请按需注入该服务。
angular.module('myApp').factory('interceptor', function($injector){

  return {
      'responseError': function(response) {
         var http = $injector.get('$http');
         http.get..
       }
  }

});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接