# angular http-error.interceptor.ts ``` ts import {Injectable} from '@angular/core'; import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse } from '@angular/common/http'; import { Observable, of, throwError} from 'rxjs'; import { retry, catchError } from 'rxjs/operators'; import { Router, Route } from '@angular/router'; import { environment } from '../../environments/environment.prod'; import { Modal } from '../models/modal.model'; import { ModalService } from '../services/modal.service'; @Injectable() export class HttpErrorInterceptor implements HttpErrorInterceptor { constructor( private router: Router, private modalService: ModalService) { } /** * intercept all XHR request * @param request * @param next * @returns {Observable<A>} */ intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { if (localStorage.getItem(`${environment.keyOfToken}`)) { request = request.clone({ setHeaders: { Authorization: localStorage.getItem(`${environment.keyOfToken}`) } }); } /** * continues request execution */ return next.handle(request).pipe(catchError((error: HttpErrorResponse) => { let errorMessage = ''; if (error.error instanceof ErrorEvent) { // client-side error errorMessage = `\nError: ${error.error.message}`; } else { // server-side error errorMessage = `\nError Code: ${error.status}\nMessage: ${error.error.message}`; // 判斷無權限 if (error.status === 401) { this.router.navigate([`/login`]); } else { // 開啟 messageModal this.openMessageModal(error.error.message); } } return throwError(errorMessage); }) as any); } // /** // * manage errors // * @param err // * @returns {any} // */ // private handleAuthError(err: HttpErrorResponse): Observable<any> { // // handle your auth error or rethrow // if (err.status === 401) { // // navigate /delete cookies or whatever // console.log('handled error ' + err.status); // this.router.navigate([`/login`]); // // tslint:disable-next-line:max-line-length // // if you've caught // // handled the error, you don't want to rethrow it unless you also want downstream consumers to have to handle it as well. // return of(err.message); // } // throw err; // } /** * 開啟 messageModal * * @param {string} message * @memberof HttpErrorInterceptor */ openMessageModal(message: string) { /** modaleOptions */ const modalOptions: Modal = { icon: 'icon', message: message } // 開啟 Modal this.modalService.open(modalOptions); } } ```