2017-05-17 14 views
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); 
     } 
    }; 
}]); 

私はトークン更新要求がエラーになったときの$ HTTPを使用すると、無限ループを引き起こしていたことを推測するので、私は私のインターセプタでJQuery.ajaxを使用。 しかし、それでもエラー時に無限ループが発生します。 オリジナルリクエスト - >更新リクエスト...

答えて

2

エラーの完全なログは表示されませんが、問題が注入に関連する可能性があります$httpサービス($ .ajaxを使用していても、httpインターセプタ内にあります)。角度が無限ループに直面し、$httpの依存関係とそのインターセプタの両方を解決しようとするため、これは循環依存を引き起こす。あなたはAJAX呼び出しが

angular.module('myApp').factory('interceptor', function($injector){ 

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

}); 
「必要により」サービスを注入しようと行う必要がある場合

は私の前の回答here

を見ます

関連する問題