Я хочу, чтобы пользователь автоматически выходил из системы, если какой-либо api возвращает ответ об ошибке 401. И для этого я перехватываю каждый запрос, и как только появляется код ошибки 401, я очищаю токен jwt в моем локальном хранилище, и защита авторизации предотвращает пользователь от перехода на этот маршрут. Но после реализации перехватчика (примеров очень мало для этого и также не упоминается в документации) я не могу выполнить ни один HTTP-запрос. Ниже мой код. Заранее спасибо.

import { Injectable, Injector } from '@angular/core';
import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpErrorResponse} from '@angular/common/http';
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/observable/throw'
import 'rxjs/add/operator/catch';

@Injectable()
export class ResponseInterceptor implements HttpInterceptor {

    constructor() {
    }

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        return next.handle(request).do((event: HttpEvent<any>) => {
        }, (err: any) => {
            if (err instanceof HttpErrorResponse) {
                // do error handling here
                console.log('and the error is ');
                console.log(err)
            }
        });
    }
}
4
Akshay 5 Окт 2018 в 16:33

1 ответ

Лучший ответ

Если это происходит с ошибкой, почему вам нужно отслеживать каждый запрос, если вам нужно только catch ?

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req).pipe(
        catchError((err:string, caught:Observable<any>)=>this.handleHttpClientError(err, caught))
    );
}

handleHttpClientError(error: any, caught: Observable<any>)
{
    if(error.status == 401){
        ... your logic here ... 
    }
    return new EmptyObservable<Response>();
    // or return Observable.throw('Auth error');
}
2
un.spike 6 Окт 2018 в 19:39