gpt4 book ai didi

angular - rxjs处理错误与拦截器不兼容

转载 作者:行者123 更新时间:2023-12-03 08:21:42 25 4
gpt4 key购买 nike

基于这个已解决的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))
);
}

如果我的身份验证 token 无效/已过期,则服务将捕获该错误。
我可以在那里打电话注销。

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

如果我在服务中保留catchError,则不会同时触发这两个事件。

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

如果选择保留catchError,则需要修改所有参数以调用某种全局错误处理函数,以使其保持DRY状态。但是后来我没有像我应该那样使用Angular。

我该如何处理这种情况?

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

错误处理程序处于 Activity 状态,拦截器在app.module中注释。
如果从服务中删除catchError,则会触发ErrorHandler,否则catchError优先。

最佳答案

如果要使用共享的拦截器,则可以使用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']);
}
}
)
);
}
}

另一种将是在路线顶部使用 防护

关于angular - rxjs处理错误与拦截器不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55137275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com