【问题标题】:Handling error with rxjs not compatible with interceptorsrxjs 处理错误与拦截器不兼容
【发布时间】:2019-08-03 20:35:10
【问题描述】:

基于这个已解决的问题Angular intercepting http errors,我面临着一个巨大的哲学问题。

我所有的服务都是这样的:

public getSomething(): Observable<Something> {
    return this.http
        .get<Something>(url)
        .pipe(
            map(res => res.data),
            catchError((e): Observable<any> => of(e))
        );
}

如果我的身份验证令牌无效/过期,服务会捕获错误。 我可以在那儿直接注销。

但是,如果我有很多服务,我必须多次重复这个过程。因此我需要配置一个拦截器或自定义错误处理程序。

如果我在服务中保留 catchError,两者都不会触发。

如果我选择保持 DRY,我需要删除 catchError。如果我删除 catchError,rxjs 将变得几乎无用(完成、重试......等)

如果我选择保留 catchError,我需要修改所有这些以调用某种全局错误处理函数以保持一定程度的 DRY。但是我并没有像我应该使用的那样使用 Angular。

我该如何处理这种情况?

编辑:https://stackblitz.com/edit/angular-m2jc9n

ErrorHandler 处于活动状态,Interceptor 在 app.module 中进行了注释。 如果从服务中移除 catchError,则触发 ErrorHandler,否则 catchError 优先。

【问题讨论】:

  • catchError 并没有真正捕获错误,它只是在发生错误时保持流继续,将错误交换为返回值。而且由于流不会停止并且您使用HttpClient,我不明白为什么您的拦截器不会触发。考虑留下您的问题的minimal reproducible example 以显示确切的问题。
  • “如果我在服务中保留 catchError,两者都不会触发” - 你能解释一下吗?
  • @trichetriche 你在这里有一个堆栈闪电战angular-m2jc9n.stackblitz.io
  • @gyc 能否提供 stackblitz 的链接而不是它的演示?
  • @tricheriche 哦对不起:stackblitz.com/edit/angular-m2jc9n

标签: angular error-handling rxjs


【解决方案1】:

如果你想拥有一个共享拦截器,你有角度HTTP_INTERCEPTOR

在你的module.ts

@NgModule({
  declarations: [
   ...
  ],
  imports: [
   ...
  ],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: LoginInterceptor,
      multi: true
    }
  ]
})

还有服务LoginInterceptor

@Injectable()
export class LoginInterceptor implements HttpInterceptor {

  constructor() {
  }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return next.handle(request).pipe(
      tap(() => {
        }, (err: any) => {
          if (err instanceof HttpErrorResponse) {
            // DO here what you want
            // this.router.navigate(['login']);
          }
        }
      )
    );
  }
}

另一种选择是在路线顶部使用守卫

【讨论】:

  • Endeed,但使用tap方法,不需要catchError。
  • 如果我在服务中使用点击,拦截器会被触发......这并没有告诉我原因(我仍然需要修改我的所有服务)但它在一定程度上解决了我的问题。跨度>
猜你喜欢
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 2019-03-12
  • 2018-11-04
  • 2016-09-20
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多