Изменить успешный ответ на ошибку в Angular 6+ HttpInterceptor

Мне нужен HttpInterceptor, который изменяет успешный ответ Http 200 на ошибку 500 Http.

Однако у меня есть рабочий перехватчик, но когда дело доходит до преобразования успешного ответа в ошибку, подписчик http напрямую вызывает «полный» обработчик (ни следующий, ни обработчик ошибок не вызываются).

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next
      .handle(request)
      .pipe(
        map((event: HttpEvent<any>):any => {
          let type = this.convertTypeToString(event.type);
          if (type === "Response") {
            let error: HttpErrorResponse = new HttpErrorResponse({status: 500});
            return Observable.create(observer => observer.error(error));
          }
          return event;
        })
      );
}

Ожидаемое поведение: когда я запускаю, например. вызов входа в систему, я хочу вернуть - даже при успешном входе - ошибка Http 500.


person Markus Rossler    schedule 30.04.2019    source источник


Ответы (2)


Решение состоит в том, чтобы вообще НЕ использовать HttpHandler для совершения вызова. Просто предоставьте Observable, который возвращает ошибку:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  let error: HttpErrorResponse = new HttpErrorResponse({status: 500});
  return Observable.create(observer => observer.error(error));
}

HttpHandler должен сделать запрос «для вас». Но когда это был успешный запрос, трудно (невозможно?) перенаправить его на ответ об ошибке. Поэтому пропустите вызов next.handle() и имитируйте вызов, возвращая Observable.

person Markus Rossler    schedule 02.05.2019

Вы можете использовать throwError Observer для возврата обработчика успеха формы наблюдателя.

import { throwError } from 'rxjs';

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next
      .handle(request)
      .pipe(
        map((event: HttpEvent<any>):any => {
          let type = this.convertTypeToString(event.type);
          if (type === "Response") {
            let error: HttpErrorResponse = new HttpErrorResponse({status: 500});
            return throwError(err);
          }
          return event;
        })
      );
}
person ankit jain    schedule 11.02.2021