在延迟加载的模块中注册HTTP-Interceptor

时间:2015-04-09 14:37:39

标签: angularjs angular-resource angular-http angular-http-interceptors

早上好, 我遇到了一个我似乎无法解决的问题。

我试图在与初始配置块不同的地方注册一个httpinterceptor。

这样做符合预期:

angular.module('app', ['ngResource'])
.config(function($httpProvider) {
   $httpProvider.interceptors.push(function() {
     return {
       request: function($request) {
         console.log($request);
         return $request;
       }
     }
   })
})

但是拦截器是子模块的一部分。所以我的应用程序如下所示:

编辑:

angular.module('app', ['ngResource']);
angular.module('app.submodule', ['ngResource'])
.config(function($httpProvider) {
   $httpProvider.interceptors.push(function() {
     return {
       request: function($request) {
         console.log($request);
         return $request;
       }
     }
   })
})

此外,子模块是延迟加载的。但我认为这不是问题的根源。

我尝试通过添加:

在初始配置块中引用httpProvider
$httpProviderReference = $httpProvider;

所以我可以稍后注册一个拦截器。这甚至不能在初始run()块中工作。检查提供者,似乎有效,但拦截器永远不会被调用。

有谁知道如何解决这个问题?我正在尝试将身份验证令牌添加到请求的标头中。

提前致谢,olu

1 个答案:

答案 0 :(得分:1)

对于遇到类似问题的其他人,我就是这样做的:

我在主模块中注册了一般拦截器:

angular.module('app', ['ngResource'])
.config(function($httpProvider) {
   $httpProvider.interceptors.push('Interceptors');
})
.factory('Interceptors', function() {
  var requestFunctions = [];
  return {
    request: function($request) {
      var r = $request;
      for (var i = requestFunctions.length - 1; i >= 0; i--) {
        r = requestFunctions[i]($request);
      };
      return $request;
    },
    setRequestFunction: function(fn) {
      requestFunctions.push(fn);
    }
  }
})

工厂拥有一系列函数,这些函数是串行调用的。原始请求通过函数进行解析。子模块中的请求被更改:

angular.module('app.submodule', ['ngResource'])
.run(function($injector,MyService) {
  var Interceptors = $injector.get('Interceptors');
  Interceptors.setRequestFunction(function($request) {
      $request.headers['auth-id'] = MyService.getAuthData().authId;
      $request.headers['auth-token'] = MyService.getAuthData().authToken;
    }
    return $request;
  })
})

另外,Restangular值得一看。它是ngResource的替代品,似乎可以在应用程序的任何位置为Restangular注册拦截器。

相关问题