HttpInterceptor не работает в ленивом модуле - PullRequest
0 голосов
/ 27 ноября 2018

Я создал HttpInterceptor, который отлично работает для модуля App, однако он не вызывается для избранных модулей, которые являются ленивыми модулями.Мне интересно, почему это не работает.

  1. Я предоставил HttpInterceptor в app.module.ts.
  2. Я использую Angular 7
  3. HttpClient используется не Http.

Пожалуйста, дайте мне знать, если вам нужны другие детали.

AppModule

    @NgModule({
    declarations: [AppComponent],
    imports: [
        BrowserModule,
        BrowserAnimationsModule,
        HttpClientModule,
        AppRoutingModule,

        NgbModule.forRoot(),
        ThemeModule.forRoot(),
        CoreModule.forRoot(),
    ],
    bootstrap: [AppComponent],
    providers: [
        {provide: APP_BASE_HREF, useValue: '/'},
        AuthGuard,
        {
            provide: NbRoleProvider,
            useClass: RoleProvider,
        },
        ZtLoaderService
    ],
   })
    export class AppModule {
  }

CoreModule

export class CoreModule {
    constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
        throwIfAlreadyLoaded(parentModule, 'CoreModule');
    }

    static forRoot(): ModuleWithProviders {
        return <ModuleWithProviders> {
            ngModule: CoreModule,
            providers: [
                ...NB_CORE_PROVIDERS,
                httpInterceptorProviders
            ],
        };
    }
}

httpInterceptorProviders

export const httpInterceptorProviders = [

    {provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true},
    {provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true}

];

AuthInterceptor

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

    constructor(private injector: Injector) {
    }

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // do not intercept request whose urls are filtered by the injected filter
        console.log("intercept.........................");
        this.authService.isAuthenticatedOrRefresh().subscribe(response=>{
            console.log("authenticated ----------->", response);
        })
        return this.authService.isAuthenticatedOrRefresh()
            .pipe(
                switchMap(authenticated => {
                    if (authenticated) {
                        return this.authService.getToken().pipe(
                            switchMap((token: any) => {
                                const JWT = `Bearer ${token.getValue()}`;
                                req = req.clone({
                                    setHeaders: {
                                        Authorization: JWT,
                                    },
                                });
                                return next.handle(req);
                            }),
                        )
                    } else {
                        // Request is sent to server without authentication so that the client code
                        // receives the 401/403 error and can act as desired ('session expired', redirect to login, aso)
                        return next.handle(req);
                    }
                }),
            )

    }

    protected get authService(): NbAuthService {
        return this.injector.get(NbAuthService);
    }

}

Ленивый модуль: BPOEntryModule

@NgModule({
    imports: [
        ThemeModule,
        BPORoutingModule,
        Ng2SmartTableModule
    ],
    declarations: [
        ...routedComponents,
        BlListEntry,
        EntryListSearchResultComponent,
        EntryListSearchComponent,
        ModalComponent,
        ResultItemComponent,
        ResultToolbarComponent
    ],
    entryComponents: [ModalComponent],

    providers: [BPOEntryService]
})
export class BPOEntryModule {}

1 Ответ

0 голосов
/ 28 ноября 2018

Вы упоминаете, что используете Angular 7, поэтому вам, вероятно, следует использовать pipe() вместо do() в вашем перехватчике.

Примечание: создайте демонстрацию StackBlitz, если проблема не в этом, и кто-то с этим разберется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...