Angular5 перехватчик ответа HTTP не может прочитать код состояния

Я пытаюсь перехватить HTTP-ответы и перенаправить любые 401, но объект err ниже возвращает мне только следующую строку. Я ожидал хотя бы найти код статуса ..

401 - Несанкционированные сведения: ответ об ошибке HTTP для http://localhost:4200/api/foo: 401 Неавторизованный

На вкладке сети я вижу, что сервер возвращает правильно сформированный 401. Есть идеи, как я могу их правильно читать?

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const authRequest = request.clone({
        setHeaders: {
            Authorization: `Bearer ${this.authService.getToken() || ''}`
        }
    });

    return next.handle(authRequest).do(event => { }, err => {
        if (err instanceof HttpErrorResponse && err.status === 401) {
            this.authService.handleAuthentication();
        }
    });
}

Изменить: я только что заметил, что если я отключу веб-сервер, чтобы принудительно установить тайм-аут шлюза 504, я также получаю сообщение об ошибке в виде полной строки без кода ошибки.

504 - Сведения о тайм-ауте шлюза: ответ об ошибке HTTP для http://localhost:4200/api/foo: Ошибка 504 Время ответа сервера истекло


person Grant    schedule 16.12.2017    source источник
comment
Я проверяю код статуса внутри другого оператора if   -  person Chau Tran    schedule 16.12.2017
comment
@ChauTran не уверен, как это мне помогает. объект "err" всегда является строкой ..   -  person Grant    schedule 16.12.2017
comment
Я просто говорю, как я это сделал в моем случае.   -  person Chau Tran    schedule 16.12.2017


Ответы (4)


попробуй использовать улов

return next
    .handle(authReq)
    .do(event => {
        if (event instanceof HttpResponse) {
            /* Make your code here */
        }
    })
    .catch((err) => {
        if (err.status === 401 && err.statusText === 'Unauthorized') {


        }
        return Observable.throw(err);
    });
person Rowel de Guzman    schedule 16.12.2017
comment
Привет, переход на catch не имеет никакого значения. err по-прежнему является строкой. - person Grant; 16.12.2017

Итак, проблема заключалась в том, что у меня был уже существующий перехватчик ошибок, который изменял ответ до моего перехватчика 401. Этот парень все натягивал. Спасибо всем вышеперечисленным ответам.

person Grant    schedule 22.12.2017

Мне удалось правильно настроить Auth Interceptor в Angular 5, выполнив следующие действия:

auth.interceptor.ts

import { Injectable } from '@angular/core';
import {
    HttpErrorResponse,
    HttpEvent,
    HttpHandler,
    HttpInterceptor, 
    HttpRequest,
} from '@angular/common/http';
import { Observable } from 'rxjs/Observable';

import { AuthService } from '../services/auth.service';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor(
      private authService: AuthService
  ) { }

  public intercept(
      req: HttpRequest<any>,
      next: HttpHandler,
  ): Observable<HttpEvent<any>> {
    return this.authService.getToken().flatMap((token: string) => {
      return next.handle(req.clone({ setHeaders: { Authorization: `Bearer ${token}` } }));
    }).do(() => { }, (error: any) => {
      if (error instanceof HttpErrorResponse && (error as HttpErrorResponse).status === 401) {
        this.authService.login();
      }
    });
  }
}
person tnc1997    schedule 16.12.2017

Для Angular 6 посмотрите этот пост:
HttpClient Interceptor заставляет запрашивать дубликаты

person badera    schedule 19.06.2018