Angular: перехватить ошибки HTTP и продолжить цепочку - PullRequest
2 голосов
/ 17 апреля 2020

Я хочу трактовать определенные коды ошибок HTTP как не связанные с ошибками и нормально обрабатывать их ответы. Поэтому я попытался добавить HttpInterceptor, чтобы перехватить 500 кодов состояния и вернуть исходный ответ (который Angular вставляет error.error):

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req).pipe(
      catchError((error: HttpErrorResponse) => {
        if (error.status === 500) {
          return of(error.error);
        } else {
          return throwError('server error');
        }
      })
    );
  }

Но тогда, если есть ошибка, все, что я был передан в мой http-запрос не выполняется. Например, если я сделаю это, оператор log не произойдет:

this.http.get(...).pipe(
  tap(console.log)
)

Как мне сделать эту работу?

Вот образец ... он никогда не регистрирует «полученный результат» от AppComponent.

1 Ответ

3 голосов
/ 17 апреля 2020

Ваша цепочка перестает работать, поскольку Angular модуль http фильтрует сообщения, которые он получает от перехватчика:

const res$: Observable<HttpResponse<any>> = <Observable<HttpResponse<any>>>events$.pipe(
        filter((event: HttpEvent<any>) => event instanceof HttpResponse));

Как видите, вы должны вернуть поток класса HttpResponse, например :

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

if (error.status === 404) {
  console.log('caught', error.error);

  return of(new HttpResponse({
    body: error.error
  }));
}

Разветвленный стек-блиц

...