Пропуск модального окна из HttpErrorHandle в AuthInterceptor - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть HttpErrorInterceptor и AuthInterceptor.Обе они обрабатывают код ошибки 400. Проблема возникает, когда я пытаюсь обновить токен jwt, а бэкэнд выдает неверный запрос, поскольку токен обновления истек или недействителен.В случае, если неправильный запрос происходит на /api/token/refresh, я просто хочу выйти из системы и подавить все ошибки .Я добавил дополнительный заголовок, который должен пропускать модальное окно ошибки в HttpErrorInterceptor, но проблема в том, что настоящая ошибка возникает до пропуска кода и, в конце концов, появляется раздражающее модальное окно сообщения.

Если вы посмотрите наНа изображении ниже вы увидите, что this.authService.logout() был выполнен, а сразу после него HTTP Interceptor Skip (из HttpErrorInterceptor) и над ними была отображена фактическая ошибка.

enter image description here

Как я могу подавить все сообщения об ошибках для /api/token/refresh (this.authService.refreshToken()), чтобы в случае сбоя не отображалось это модальное окно с кодом ошибки 400?

https://stackblitz.com/edit/angular-dziwbx

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Я сделал это с HttpBackend.В основном он обходит перехватчики.

import { HttpClient, ..., HttpBackend } from '@angular/common/http';

@Injectable()
export class TestService {

  private httpClient: HttpClient;

  constructor( handler: HttpBackend) { 
     this.httpClient = new HttpClient(handler);
  }
....
0 голосов
/ 19 сентября 2019

Мне трудно точно сказать, в чем проблема (поскольку я не знаю, как Angular обрабатывает это за кулисами), но я думаю, что все сводится к тому, как обрабатывать поток, который генерирует ошибки.

const obsErr$ = throwError('err');

function intercept (src) {  
  return src
    .pipe(
      catchError(v => {
        return of('err caught in int1: ' + v);
      })
    )
}

function intercept2 (src) {
  return src
    .pipe(
      catchError(v => {
        return of('err caught in int2: ' + v);
      })
    )
}

Случай 1

obsErr$
  .pipe(
    intercept,
    intercept2,
  )
  .subscribe(console.log) // err caught in int1: err

Ошибка будет обнаружена только один раз в первом перехватчике.

Случай 2

obsErr$.pipe(intercept)
  .subscribe(v => console.log('i1', v))

obsErr$.pipe(intercept2)
  .subscribe(v => console.log('i2', v))

Здесь каждый перехватчик будет иметь свой собственный источник, а также свою собственную ошибку, которую нужно отловить.

Надеюсь, это каким-то образом поможет.

StackBlitz .

...