web-dev-qa-db-fra.com

Angular httpClient interceptor error handling

après avoir lu la documentation sur angular sur la gestion des erreurs du client http, je ne comprends toujours pas pourquoi je n'attrape pas une erreur 401 du serveur avec le code ci-dessous:

export class interceptor implements HttpInterceptor {
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        console.log('this log is printed on the console!');

        return next.handle(request).do(() => (err: any) => {
            console.log('this log isn't');
            if (err instanceof HttpErrorResponse) {
                if (err.status === 401) {
                    console.log('nor this one!');
                }
            }
        });
    }
}

sur le journal de la console, j'obtiens également ceci:

zone.js: 2969 GET http: // localhost: 8080/test 401 ()

core.js: 1449 ERREUR HttpErrorResponse {headers: HttpHeaders, status: 401, statusText: "OK", url: " http: // localhost: 8080/test ", ok: false,…}

6
sarahwc5

Vous devez intercepter une erreur en utilisant catchError

return next.handle(request)
      .pipe(catchError(err => {
        if (err instanceof HttpErrorResponse) {
            if (err.status === 401) {
                console.log('this should print your error!', err.error);
            }
        }
}));
5
Amit Chigadani

Vous devez passer la valeur de l'argument à la fonction do du flux, pas créer une nouvelle fonction à l'intérieur:

return next.handle(request)
    .do((err: any) => {
        console.log('this log isn't');
        if (err instanceof HttpErrorResponse) {
            if (err.status === 401) {
                console.log('nor this one!');
            }
        }
    });
1
Daniel Caldera

Votre gestionnaire d'erreurs doit renvoyer une new Observable<HttpEvent<any>>()

return next.handle(request)
    .pipe(catchError((err: any) => {
        console.log('this log isn't');
        if (err instanceof HttpErrorResponse) {
            if (err.status === 401) {
                console.log('Unauthorized');
            }
        }

      return new Observable<HttpEvent<any>>();
    }));
1
Tito Leiva

Il est hors de portée, mais Angular a une meilleure opportunité de gestion des erreurs que l'intercepteur. Vous pouvez implémenter votre propre ErrorHandler. https://angular.io/api/core/ErrorHandler =

0
Oleksii