4

私はAUTH HttpInterceptor持っている:Angular4インターセプタ変更応答

import {HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, 
HttpRequest} from '@angular/common/http'; 
import {AuthService} from '../service/auth.service'; 
import {Observable} from 'rxjs/Observable'; 
import {Injectable} from '@angular/core'; 
import {Router} from '@angular/router'; 

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

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    const authHeader = this.authService.getToken(); 
    const clone = req.clone({headers: req.headers.set('Authorization',authHeader)}); 
    return next.handle(clone).do(() => { 
}, err => { 
    console.log(err); 
    if (err instanceof HttpErrorResponse && err.status === 401) { 
    this.authService.clearToken(); 
    this.router.navigate(['/auth/signin']); 
    return Observable.empty(); 
     } 
    }); 
    } 
} 

このインターセプタが正常に動作しますが、私は401を取得していたときに私がログインページにユーザーをリダイレクトしていますが、エラーがまだサービスに行くと、そのサービスではエラーメッセージを表示しています。このメッセージはサインインページに表示されます。だから私は応答を変更するか、if (err instanceof HttpErrorResponse && err.status === 401) {ブロックで何かをしたい、この場合エラーを返さない。

return Observable.empty(); 

答えて

7

next.handle(clone).do()を働いていない - これは、そのような行動を起こしているものです。 do()オペレータは副作用のみを提供することを意図していますが、観測可能なパイプのデータフローとエラー処理に実際には影響しません。本質的には、「これが起こったときにこれを行い、それからdo()セクションが全くないかのように続行してください」と言います。エラーを抑制したい場合は、演算子catch()を使用する必要があります。

コードはほぼ同じになります:

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

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
     const authHeader = this.authService.getToken(); 
     const clone = req.clone({headers: req.headers.set('Authorization',authHeader)}); 
     return next.handle(clone).catch(err => { // <-- here 
      console.log(err); 
      if (err instanceof HttpErrorResponse && err.status === 401) { 
       this.authService.clearToken(); 
       this.router.navigate(['/auth/signin']); 
       return Observable.empty(); 
      } 
      // we must tell Rx what to do in this case too 
      return Observable.throw(err); 
     }); 
    } 
} 
+0

あなたがキャッチして、小さな例を書いてくださいすることができますか? – user2870934

+0

@ user2870934、私は私の答えを編集しました。コードはほぼ同じですが、あなたは非常に近いです。 –

関連する問題