1

Я пытаюсь реализовать Угловой перехватчик для Исключения. По крайней мере, для одного. У меня есть токен, и когда он устаревает, он делает TokenAlmostExpired exception. Это исключение содержит errorCode = 101. В перехватчике я проверяю, что код 101, а затем мне нужно отправить POST request в backend's /refresh endpoint, чтобы я мог обновить токен.Сделайте запрос http от Angular Interceptor?

.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

Но есть проблема на уровне перехватчика, что я не могу просто дать ему зависимость от $http, потому что есть Circular dependency found: $http <- errorInjector <- $http <- $templateFactory <- $view <- $state

$ scope

И не могу поставить getRefreshToken() на $scope, так как зависимость $ scope также дает «Циркулярную зависимость».

$ Injector

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

не работает, как хорошо, и дает мне Erorr.

Итак, как я могу поймать исключение в перехватчике, а затем сделать запрос $ http оттуда?

+0

Возможно, вы захотите рассмотреть вопрос об отмене события и получить его в службе и выполнить выполнение оттуда –

+0

Не используйте корневой указатель, создайте свой собственный агрегатор событий ... –

+0

Можете ли вы показать полный код ошибки? Похоже, что это не полная реализация. –

ответ

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

Изменение To:

.factory ('errorInjector', [ '$ д', функция ($ д) {....}]);

+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

попробуйте $ испускать из обработчика ошибок, то) надеюсь, что это поможет –

Смежные вопросы