是否可以在嵌套惰性模块中使用 HTTP_INTERCEPTORS?
Is it possible to use HTTP_INTERCEPTORS within a nested lazy module?
我有一个 FooModule
嵌套在 AppModule
:
AppModule
:
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.model';
@NgModule({
imports: [
AppRoutingModule
],
bootstrap: [AppComponent]
})
export class AppModule { }
FooModule
:
import { NgModule } from '@angular/core';
import { AuthInterceptorService } from '../auth/auth-interceptor.service';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
@NgModule({
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptorService,
multi: true
}
]
})
export class FooModule {}
正在通过延迟加载加载 FooModule
:
AppRoutingModule
:
const appRoutes : Routes = [
{
path: "foos",
loadChildren: () =>
import("./foos/foos.module").then(m => m.FoosModule)
}
]
@NgModule({
imports: [RouterModule.forRoot(appRoutes, { preloadingStrategy: PreloadAllModules })],
exports: [RouterModule]
})
export class AppRoutingModule {
}
但只有当我将 HTTP_INTERCEPTORS
移动到 AppModule
时,http-s 才会被拦截,有没有办法让拦截器从 FooModule
.
我问的是导致拦截器执行添加仅与 FooModule
.
相关的授权的特定工作
看起来可以通过嵌套延迟加载模块加载 HTTP_INTERCEPTORS
,我只是缺少在嵌套模块中导入 HttpClientModule
:
@NgModule({
import: HttpClientModule,
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptorService,
multi: true
}
]
})
export class FooModule {}
但是,因为HttpClientModule
是一个单例,所以它应该只定义一次,最好的地方是在AppModule
里面。所以我最终将拦截器和 http 客户端从 AppModule
导入,同时将 resolve
修改为基于 req.url
:
的条件解析器
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (req.url == this._config.SecretAPI) {
//Add Authorization Header:
const modifiedReq = req.clone({
headers: new HttpHeaders().set('Authorization', this._authService.authorizationHeaderValue)
});
return next.handle(modifiedReq);
}
else {
return next.handle(modifiedReq);
}
}
我有一个 FooModule
嵌套在 AppModule
:
AppModule
:
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.model';
@NgModule({
imports: [
AppRoutingModule
],
bootstrap: [AppComponent]
})
export class AppModule { }
FooModule
:
import { NgModule } from '@angular/core';
import { AuthInterceptorService } from '../auth/auth-interceptor.service';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
@NgModule({
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptorService,
multi: true
}
]
})
export class FooModule {}
正在通过延迟加载加载 FooModule
:
AppRoutingModule
:
const appRoutes : Routes = [
{
path: "foos",
loadChildren: () =>
import("./foos/foos.module").then(m => m.FoosModule)
}
]
@NgModule({
imports: [RouterModule.forRoot(appRoutes, { preloadingStrategy: PreloadAllModules })],
exports: [RouterModule]
})
export class AppRoutingModule {
}
但只有当我将 HTTP_INTERCEPTORS
移动到 AppModule
时,http-s 才会被拦截,有没有办法让拦截器从 FooModule
.
我问的是导致拦截器执行添加仅与 FooModule
.
看起来可以通过嵌套延迟加载模块加载 HTTP_INTERCEPTORS
,我只是缺少在嵌套模块中导入 HttpClientModule
:
@NgModule({
import: HttpClientModule,
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptorService,
multi: true
}
]
})
export class FooModule {}
但是,因为HttpClientModule
是一个单例,所以它应该只定义一次,最好的地方是在AppModule
里面。所以我最终将拦截器和 http 客户端从 AppModule
导入,同时将 resolve
修改为基于 req.url
:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (req.url == this._config.SecretAPI) {
//Add Authorization Header:
const modifiedReq = req.clone({
headers: new HttpHeaders().set('Authorization', this._authService.authorizationHeaderValue)
});
return next.handle(modifiedReq);
}
else {
return next.handle(modifiedReq);
}
}