0

我想将 Angular 路由器注入到我的 HttpInterceptor 中。不幸的是,浏览器控制台中抛出了以下错误:

类型错误:this.router 未定义

我像往常一样将它添加到我的构造函数中:

constructor (private router: Router) {

}

此外,我在 app.module.ts 中的 providers 数组中执行了以下操作:

{
  provide: HTTP_INTERCEPTORS,
  useClass: MyService,
  multi: true,
  deps: [Router]
}

我想在我的错误处理程序的 if 语句中使用当前 url 来为不同的路由提供特定的功能:

myErrorHandler(error: HttpErrorResponse) {
   if (this.router.url === 'test') {
     // do something
   } else {
     return throwError(error).pipe(
       // do something
     );
   }
}

我究竟做错了什么?

4

3 回答 3

2

我从另一个相关主题中找到了答案:Angular 6 Service is undefined after injectioning in Interceptor

基本上,注入的构造函数变量在传递给函数的函数中不可用catchError。您需要router像这样直接在“拦截方法”中访问:

constructor(private router: Router) {
}

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).pipe(
        catchError((errorResponse: HttpErrorResponse) => {
            // this.router is defined here
        })
    );
}

问题似乎出在catchError. this如果您在interceptcatchError函数中打印当前范围,您将分别获得MyInterceptorCatchSubscriberthis.router不能从 CatchSubscriber 获得。您仍然可以通过在拦截器类中添加私有方法来使用单独的函数:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).pipe(
        catchError((errorResponse: HttpErrorResponse) => {
            this.handleError(errorResponse);
        })
    );
}

private handleError(errorResponse: HttpErrorResponse) {
     // this.router is defined here
}

总结一下:

catchError(this.handleError)  // does not work because of different scope

catchError(err => this.handleError(err))  // works because of same scope
于 2020-04-04T11:05:46.693 回答
0

你做过吗?太明显了?

import { Router } from "@angular/router";
于 2019-04-30T15:35:52.987 回答
0

您可以尝试使用注射器。

constructor(inj: Injector) {
this.router = inj.get(AuthService) }

您应该注意,无法导入包含 httpClientModule 的服务以避免循环依赖。

于 2019-04-30T19:19:46.300 回答