在app.js中使用工厂时Angular'错误:$ injector:cdep循环依赖'

时间:2017-05-10 14:23:12

标签: angularjs json-web-token

我正在尝试使用令牌来处理我的用户身份验证。我在路上撞了一下,我不确定从哪里开始。我环顾四周,看起来我应该使用$injector服务,但我不是百分百肯定。有人可以帮忙吗?

我创建了一个从节点获取令牌的工厂:

angular.module('myApp').factory('authenticateInterceptor', function(authenticateToken){

var authenticateInterceptorFactory = {};

authenticateInterceptorFactory.request = function(config){

    var token = authenticateToken.getToken();

    if(token){
        config.headers['x-access-token'] = token;
    };

    return config;
}

return authenticateInterceptorFactory;

});

以下是 autenticateToken 的代码:

angular.module('myApp').factory('authenticateToken', function($http, $window){

    authenticateTokenFactory = {};

    authenticateTokenFactory.getToken = function(token){
        return $window.localStorage.getItem('token');
    };

    return authenticateTokenFactory;

});

此处没有错误,当我尝试在 app.js 中使用此工厂时出现问题。

angular.module('myApp', [
    'dependancies goes here'
])
.config(function($httpProvider){
    $httpProvider.interceptors.push('authenticateInterceptor');
});

这现在导致错误,我似乎无法将我的工厂传递到拦截器。

1 个答案:

答案 0 :(得分:2)

循环依赖最有可能是$http工厂内注入authenticateToken服务

引起的

存在冲突,因为在 bootstrap phase angular尝试按此顺序解析$http依赖项(以及其他核心服务)。

  1. $httpProvider依赖项
  2. authenticateInterceptor依赖项
  3. authenticateToken个依赖项(包括$http,此处我们将返回1.)
  4. 顺便说一句,由于$http服务未在authenticationFactory中使用,您甚至可以删除注入,但如果您需要该服务,您可以尝试仅动态注入它,以避免此行为。

    angular.module('myApp').factory('authenticateToken', function($injector, $window){
    
        authenticateTokenFactory = {};
    
        authenticateTokenFactory.getToken = function(token){
            return $window.localStorage.getItem('token');
        };
    
       authenticateTokenFactory.otherMethod = function(){
        //this code is not reached when your interceptor is added to 
        //$httpProvider interceptors array so theorically neither the exception
         var http = $injector.get('$http');
         http.get (/)...
    
       }
    
        return authenticateTokenFactory;
    
    });