2017-03-22 2 views
1

trucs angulaires me rend fou! tha application utilise l'authentification Bearer, il y a un errorInterceptor comme celui-ciangulaire déféré résoudre undefined

function errorInterceptor($injector, $log, $location) { 
     var inFlight = null; 
     var authInterceptorServiceFactory = {}; 
     var _request = function (config) { 
      config.headers = config.headers || {};  
      var oauthToken = $injector.get('oauthService').getAuthorizationHeader(); 
      if (oauthToken) { 
       config.headers.Authorization = oauthToken;  
      } 
      return config; 
     } 

     var _responseError = function (rejection) {  
      debugger   
      var deferred = $injector.get('$q').defer(); 
      switch(rejection.status){ 
       case 401: 
        console.log('401'); 
        if(inFlight == null){ 
         var authService = $injector.get('oauthService'); 
         inFlight = authService.refreshToken() //this is just a $http call 
        } 
        inFlight 
         .then(function (response) { 
          _retryHttpRequest(rejection.config, deferred) 
           .success(function (result) { 
            deferred.resolve(result); 
           }) 
           .error(function(err, status) { 
            deferred.reject(err); 
           }) 
           .finally(function() {          
            inFlight = null; 
           }); 
          $injector.get('oauthService').setLocalStorageData(response.data); 

         }, 
         function (err, status) { 
           $injector.get('oauthService').logOut(); 
         }); 
        break; 

      } 

      return deferred.promise; 
     } 

     var _retryHttpRequest = function (config, deferred) { 
      var $http = $http || $injector.get('$http'); 
      return $http(config); 
     } 

     authInterceptorServiceFactory.request = _request; 
     authInterceptorServiceFactory.responseError = _responseError; 

     return authInterceptorServiceFactory; 
    } 

il fonctionne presque, 1ère réponse 401 émet une demande « refreshToken », alors toutes les demandes ultérieures sont réexpédiés avec le nouveau jeton. Le problème que je suis confronté est dans la ligne

deferred.resolve(result); 

et bien que l'objet résultat est attendu, lorsque la fonction de promesse est invoqué son argument est indéfini!

la fonction promesse

sidebarService.getMenu() 
     .success(sidebarReady) 
     .error(sidebarReadyError); 

function sidebarReady(items) { 
     //when errorInterceptor catches the error 
     //and re-sends, when it resolves this funciton, argument is undefined 
     // 
    } 

Quelqu'un peut-il s'il vous plaît aider? merci

+0

je ne vois pas où vous passez un paramètre à votre fonction 'sidebarReady'. Vous définissez simplement la fonction comme rappel réussi sans que rien ne soit passé. –

+1

Ceci n'est pas lié à votre question, mais sachez que le stockage de votre refreshtoken dans localstorage peut être un problème de sécurité. Comme il est accessible par JavaScript, il peut être sujet à des attaques XSS potentielles. Donc, si vous voulez le stocker dans localstorage, vous devrez être absolument certain qu'aucun de votre code, et aucune de vos bibliothèques sont sensibles à XSS. –

+0

Évitez le [antipattern différé] (http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)! Juste par exemple, quand 'inFlight' rejette votre différé n'est jamais réglé. – Bergi

Répondre

1

Il suffit d'utiliser .then() au lieu de .success(), c'est obsolète depuis Angular 1.5 de toute façon et a été supprimé en 1.6. Avec .success(), le chaînage de promesses n'est pas possible, car il ne renvoie pas de nouvelle promesse à résoudre.

+0

merci cela a fonctionné! : D –

+0

puisque je ne pouvais pas tester les fragments de code jusqu'à présent, je suis presque sûr que ces promesses sont le principal problème. [Cette explication] (http://blog.ninja-squad.com/2015/05/28/angularjs-promises/) m'a beaucoup aidé. – Nekudotayim

0

il s'avère que l'utilisation de .then() au lieu de .success() a fonctionné! grâce @Nekudotayim

aussi grâce @Ben et @Nikolay

:)