Auth0的循环依赖性错误

时间:2017-05-01 02:16:23

标签: angularjs

我正在使用Udemy上的Angular和Auth0视频学习身份验证。

我已经到了处理401错误的地步,我收到了以下错误:

angular.js:66 Uncaught Error: [$injector:cdep] Circular dependency found: auth <- redirect <- $http <- auth

这是我的角度配置:

angular.config(config);

function config($provide, authProvider,
    $urlRouterProvider, $stateProvider, $httpProvider, jwtInterceptorProvider) {

    authProvider.init({
      domain: 'cmckinstry.auth0.com',
      clientId: 'Rmdm7tgPIWv1e1P6sKrBDoW8zI4kuOEa'
    });

    jwtInterceptorProvider.tokenGetter = function(store) {
      return store.get('id_token');
    }

    $urlRouterProvider.otherwise('/home');

    $stateProvider
      .state('home', {
        url: '/home',
        templateUrl: 'components/home/home.tpl.html'
      })
      .state('profile', {
        url: '/profile',
        templateUrl: 'components/profile/profile.tpl.html',
        controller: 'profileController as user'
      });

    function redirect($q, $injector, auth, store, $location) {
      return {
        responseError: function(rejection) {
          if (rejection.status === 401) {
            auth.signout();
            store.remove('profile');
            store.remove('id_token');
            $location.path('/home');
          }
          return $q.reject(rejection);
        }
      }
    }

    $provide.factory('redirect', redirect);

    $httpProvider.interceptors.push('redirect');
    $httpProvider.interceptors.push('jwtInterceptor');
  }

所以,从auth函数中取出redirect注入。但是,重定向不能正常工作。我怀疑这与authProvider有关,但我似乎无法弄明白。

1 个答案:

答案 0 :(得分:0)

查看错误消息:

  

找到循环依赖项:auth <- redirect <- $http <- auth

如错误消息中所述,形成了循环依赖关系,因为authProvider使用httpProvider,然后使用redirectProvider,它使用authProvider完成一个圆圈。

要打破这个圈子,不要在redirectProvider构造函数中注入auth作为依赖项。在需要时使用$injector service注入auth服务。

$provide.factory('redirect', redirect);
$httpProvider.interceptors.push('redirect');

//function redirect($q, $injector, auth, store, $location) {
function redirect($q, $injector, store, $location) {
  return {
    responseError: function(rejection) {
      if (rejection.status === 401) {
        //INJECT HERE
        var auth = $injector.get("auth");
        auth.signout();
        store.remove('profile');
        store.remove('id_token');
        $location.path('/home');
      }
      return $q.reject(rejection);
    }
  }
}