Ortadaki bir boruyu durdur

Dec 15 2020

Açısal uygulamamda, 401-Yetkisiz hataları engelleyen, bir erişim jetonunu yenilemeye çalışan ve orijinal http isteğini yeniden gerçekleştiren bir jeton yenileme engelleyicim var.

Belirteç yenileme uç noktası da bazı durumlarda başarısız olabilir ve bilinen bir hata döndürebilir (benim durumumda bu bir 400 invalid_grant hatasıdır).

Önleyicinin jetonu yenileyen kısmı:

 return this.httpClient
  .request('POST', "token", { observe: 'response' })
  .pipe(
    map(response => {
      // some logic when the token was refreshed successfully
    }),
    catchError(err => {
      this.routingService.navigateToLoginNoQuery();
      return throwError(err); // a 400 - invalid_grant error
    })
  );

Bu olduğunda, 2 şey yapan bir catchError işlecine ulaşır: logout (oturum açma sayfasına yönlendirmeyle) ve throwError (hata) döndürür, bu hata 400-Invalid_grant hatasıdır.

Bu, yeni hatanın, başlangıçta yenileme belirtecini tetikleyen işlevlerdeki bazı catchError işleçlerine ulaşmasına neden olur.

Sadece bağlam için: Yakalama bloklarındaki hataları günlüğe kaydediyorum ve bu tür hataları günlüğe kaydetmekten kaçınmak istiyorum, çünkü bunlar genellikle yalnızca kullanıcının belirtecinin süresinin dolduğu anlamına gelir.

Yapmak istediğim şey, bir şekilde bu operatör zincirini durdurmak ve sadece giriş sayfasına yönlendirmek.

Ortadaki bir boruyu durdurmak ve hem dış yakalama hatasını hem de borudaki sonraki operatöre ulaşmaktan kaçınmak mümkün müdür?

Yanıtlar

1 GuerricP Dec 14 2020 at 23:25

ObservableOlayların veya hataların yok edilecek bir bileşene ulaşmasını önlemek için boş bir öğe döndürebilirsiniz :

return this.httpClient
  .request('POST', "token", { observe: 'response' })
  .pipe(
    map(response => {
      // some logic when the token was refreshed successfully
    }),
    catchError(err => {
      this.routingService.navigateToLoginNoQuery();
      return EMPTY;
    })
  );
MishaBorisov Dec 14 2020 at 23:30

Soruyu doğru anladıysam, belki bir takeUntil operatörü size yardımcı olabilir. Örnek şöyle görünecek:

export class MyHttpInterceptor implements HttpInterceptor {
  anyError = new Subject();

  intercept(req: HttpRequest, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req)
      .pipe(
         takeUntil(this.anyError),
         catchError(err => {
             this.anyError.next();
             ...
         }
      )
  }
}