这是一个工作示例,说明我如何设置拦截器,为每个请求附加一个身份验证令牌(这或多或少是来自
https://docs.angularjs.org/api/ng/service/ $http的示例)
angular.module("app",[]) .config(function ($httpProvider) { $httpProvider.interceptors.push("authInterceptor"); }) .factory("authInterceptor",function ($q) { return { // interceptor configuration here } })
我的配置中有很多其他东西,并且运行块来调用和启动来自不同角度模块的服务,所以我想稍微整理一下.但是我知道在配置块中有一些非常具体的依赖注入规则,我不太明白,这些阻止我在一个单独的模块中定义我的authInterceptor工厂.由于配置和运行块中的其他逻辑调用应用程序中的其他模块,因此声明拦截器在那里看起来不合适.
这就是我想要做的:
angular.module("services.authInterceptor",[]) .factory("authInterceptor",function ($q) { return { // interceptor configuration here } }); angular.module("app",[ "services.authInterceptor" ]).config(function ($httpProvider,authInterceptor) { $httpProvider.interceptors.push("authInterceptor"); }); // Error: Unknown provider authInterceptor.
我尝试将它注入运行块,但我猜你不允许在那里注入$httpProvider:
angular.module("app",[ "services.authInterceptor" ]).run(function ($httpProvider,authInterceptor) { $httpProvider.interceptors.push("authInterceptor"); }); // Error: Unknown provider: $httpProviderProvider <- $httpProvider
我应该在哪里注入模块,以便$httpProvider也可以注入,我应该在哪里添加拦截器到现有的?我的主要目标是将拦截器和其他类似服务保存在自己的自包含模块中.
编辑
我得到一个不同的错误,当我宣布一个提供者而不是工厂时,似乎让我更接近(出于某种原因,我一直认为这些是可以互换的):
angular.module("services.authInterceptor") .provider("authInterceptor",function ($q) { return {} }) // Error: Unknown provider: $q
所以它现在成功地将authInterceptor注入我的配置块,但在尝试查找$q时失败.
解决方法
在配置阶段,只能注入提供者和常量.这是为了防止服务在完全配置之前进行实例化.
这就是您按名称注册拦截器的原因(将名称作为字符串推入$httpProvider.interceptors数组).它们将在运行时稍后解析.
这正是您在工作示例中所做的,以及您在第二步中需要做的事情,即使拦截器在另一个模块中:
angular.module("services.authInterceptor",["services.authInterceptor"]) .config(function ($httpProvider) { $httpProvider.interceptors.push('authInterceptor'); });