1

예외를위한 각도 인터셉터를 구현하려고합니다. 적어도 하나는. 나는 토큰을 가지고 있고, 오래된 enogh 백엔드가 TokenAlmostExpired exception을 던질 때. 이 예외는 errorCode = 101을 포함합니다. 요격 코드에서 코드가 101인지 확인한 다음 POST request을 백엔드의 /refresh endpoint으로 보내야 토큰을 새로 고칠 수 있습니다.

.factory('errorInjector',['$injector', function ($q, $injector) { 

    var vm = this; 

    var errorInjector = { 
     'response': function (response) { 
      console.log(response); 
      return response; 
     }, 
     'responseError': function (rejection) { 
      if (JSON.stringify(rejection.data.errorCode) === JSON.stringify(101)) { 
       vm.getRefreshToken(); 
      } 
      return $q.reject(rejection); 
     } 
    }; 
    return errorInjector; 
}]); 

.config(['$httpProvider', function ($httpProvider) { 
     $httpProvider.interceptors.push('errorInjector'); 
    }]); 

$ HTTP

그러나 요격 수준에서 문제가 Circular dependency found: $http <- errorInjector <- $http <- $templateFactory <- $view <- $state

이 때문에 난 그냥, 그것은 $http에 의존성 줄 수 없다,있다 $ 범위

$ 범위 종속성도 '순환 종속성'을 제공하기 때문에 에 getRefreshToken() 함수를 넣을 수 없습니다.

$ 인젝터

var http = $injector.get('$http'); 

은 잘 작동하지 않습니다, 그리고 나 erorr 제공합니다.

그래서 어떻게하면 인터셉터에서 예외를 발견하고 거기에서 $ http 요청을 할 수 있습니까?

+0

이벤트를 해고하고 거기에서 실행을 수행하고 거기에서 실행을 수행하는 것이 좋습니다 –

+0

rootscope를 사용하지 말고 직접 이벤트 수집기를 만드십시오 ... –

+0

전체 errorInjector 코드를 표시 할 수 있습니까? 완전한 구현이 아닌 것 같습니다. –

답변

0

그래서 나는 서비스를 완료했습니다. 모두에게 감사드립니다!

인터셉터 :

.factory('errorInjector',['$injector', function ($q, $injector) { 

    var errorInjector = { 
     'response': function (response) { 
      .... 
     }, 
     'responseError': function (rejection) { 
      if (JSON.stringify(rejection.data.errorCode) === JSON.stringify(101)) { 
       var refreshTokenService = $q.get('refreshTokenService'); 
       refreshTokenService.refreshTokenService(); 
       $.notify({message: data.data.detailMessage}, {type: 'warning'}); 
      } 
      return $q.reject(rejection); 
     } 
    }; 

    return errorInjector; 
}]); 

refreshTokenService :

.service('refreshTokenService', ['$http', function ($http) { 

    this.refreshTokenService = function() { 
     $http.post('/refresh').then(
      function success(response) { 
       ..... 
      }, 
      function error(data) { 
       ..... 
      } 
     ); 
    }; 

}]) ;

0

.factory ('errorInjector', [ '$ injector', function ($ q, $ injector) {....}]));

변경할 :

.factory ('errorInjector'[ '$ q를'기능의 ($ Q) {...}]);

+0

고마워, 네가 맞아.하지만 그게 어떻게 도움이 될까? – ottercoder

+0

더 많은 것을 원한다면 ... –

1

인터셉터

(function (angular) { 
    'use strict'; 

    angular.module('services').factory("httpInterceptor", [ 
     'errorLauncher', 
     '$q', 
     function (errorLauncher, $q) { 
      return { 
       'requestError': function (rejection) { 
        if (rejection.status === 101) { 
         errorLauncher.pushInErrorMessage(rejection); 
        } 
        return $q.reject(rejection); 
       }, 
       'responseError': function (rejection) { 
        if (rejection.status === 101) { 
         errorLauncher.pushInErrorMessage(rejection); 
        } 
        return $q.reject(rejection); 
       } 
      }; 
     }]); 
})(angular); 

및 오류 처리기 서비스

(function (angular) { 
    'use strict'; 

    angular.module('services').factory("errorLauncher", [ 
     '$rootScope', 
     function ($rootScope) { 
      return { 
       'pushInErrorMessage': function (rejection) { 
        $rootScope.$emit('theTokenWillDieSoon'); 
       } 
      }; 
     }]); 
})(angular); 

현재 주요 응용 프로그램 컨트롤러

(function (angular) { 
    'use strict'; 

    angular.module('controllers').controller("globalCtrl", [ 
     '$rootScope', 
     '$http', 
     function ($rootScope, $http) { 
      $rootScope.$on('theTokenWillDieSoon', function() { 
       // http from here 
      }); 
     }]); 
})(angular); 
+0

'순환 의존성 발견 : $ http <- errorLauncher <- httpInterseptor <- $ http <- $ templateFactory <- $ view <- $ state' :/ – ottercoder

+0

$ 오류 처리기에서 내 보낸다) 도움이되기를 바란다. –

관련 문제