2017-05-17 1 views
3

Ich baue eine AngularJs-App, die mit einer benutzerdefinierten API arbeitet, letztere benötigt ein gültiges Autorisierungstoken, wenn dies nicht der Fall ist, gibt meine API einen 4O1-HTTP-Statuscode zurück.

Daher verwende ich einen http-Interceptor, der nach einem neuen Token fragen soll, bevor ich die vorherige Anfrage wiederholen kann.

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); 
     } 
    }; 
}]); 

Ich benutzen jQuery.ajax in meinem Abfangjäger, weil ich, dass mit $ http erraten war die unendliche Schleife verursachen, wenn die Token-Erneuerungsanforderung zu einem Fehler geführt hat. Aber es verursacht immer noch eine Endlosschleife bei Fehler: Original-Anfrage -> Erneuerungs-Anfrage ...

Antwort

2

Ich sehe nicht das vollständige Protokoll des Fehlers, aber ich denke, das Problem könnte mit der Injektion von verbunden sein $http Service (das ist immer noch da, auch wenn Sie $ .AJAX verwenden) in einem http-Interceptor. Dies wird eine zirkuläre Abhängigkeit verursachen, da der Winkel einer Endlosschleife gegenübersteht, die versucht, sowohl die Abhängigkeit von $http als auch ihren Interzeptor aufzulösen.

siehe meine vorherige Antwort here

, wenn Sie ein Ajax-Aufruf machen müssen versuchen, den Dienst „nach Bedarf“ Injizieren

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

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

}); 
Verwandte Themen