早上好, 我遇到了一个我似乎无法解决的问题。
我试图在与初始配置块不同的地方注册一个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
答案 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注册拦截器。