Ошибка из HTTP-вызова не перехватывается, когда я подписываюсь на результат, но перехватывается моим HTTP-перехватчиком

#angular #angular-httpclient #angular-http-interceptors

#angular #angular-httpclient #angular-http-interceptors

Вопрос:

Я нахожусь на Angular 10 (раньше я был на 8 с той же проблемой). В следующем методе я подписываюсь на HTTP-запрос в моем компоненте:

     this.httpData.updateRadioAnswers(questions)
    .subscribe(
      result => this.requestResult = <any>result,
      error => {
        this.requestError = <any>error;
        console.log('error! ' this.requestError);
      },
      () => {
          console.log(this.requestResult);
      });
  

И у меня также есть этот HTTP-перехватчик:

     intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        if (this.oauth.token amp;amp; !req.headers.has('Authorization')) {
            req = req.clone(this.getHttpHeaders(null));
            return next.handle(req).pipe(
                tap((event: HttpEvent<any>) => { }, err => {
                    if (err instanceof HttpErrorResponse) {
                        console.log(err);
                    }
                })
            );
        } else {
            return next.handle(req);
        }
    }
  

Когда мой HTTP-запрос не выполняется успешно, я хотел бы обработать ошибку в моем компоненте (первый блок), но код внутри «error» никогда не выполняется. Однако код для «err» в перехватчике будет выполнен при возникновении ошибки. Как я могу правильно выполнить некоторый блок кода в моем компоненте, когда HTTP-запрос выдает ошибку? Я не хочу обрабатывать это в перехватчике, поскольку я хочу настроить сообщения об ошибках для разных запросов, а не для того, чтобы они были одинаковыми от перехватчика.

Ответ №1:

Попробуйте это:

 intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (this.oauth.token amp;amp; !req.headers.has('Authorization')) {
        req = req.clone(this.getHttpHeaders(null));
        return next.handle(req).pipe(
            catchError(error => throwError(error))
        )
    } else {
        return next.handle(req);
    }
}
  

Комментарии:

1. Я пробовал это, но он по-прежнему не выполняет код в части ошибки моей подписки в компоненте