1

私は、例外のための角度インターセプターを実装しようとしています。少なくとも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にそれに依存性を与えることができないことを、インターセプタレベルであります$ scope

そして、$ scope依存性が '循環依存性(circular dependency)'をも与えるので、の機能を$scopeにすることはできません。

$インジェクターは

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

$エラーハンドラからそれを出してください) –

関連する問題