0

インターセプタコードをリードバックすることはできません。角度5ログインターセプタがエラーをthrowedが、関数を呼び出すと、エラー

import { Injectable } from '@angular/core'; 
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse, HttpErrorResponse } from '@angular/common/http'; 
import { Observable } from 'rxjs/Observable'; 
// import { tap, map, catchError } from 'rxjs/operators'; 
import 'rxjs/add/observable/throw'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/operator/do'; 

@Injectable() 
export class LogInterceptor implements HttpInterceptor { 

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
     console.log(`HTTP: ${req.urlWithParams}`); 

     return next.handle(req) 
      .catch((err, caught) => { 
       console.log(err); 
       if (err.error instanceof Error) { 
        // A client-side or network error occurred. Handle it accordingly. 
        console.log('An error occurred:', err.error.message); 
       } else { 
        // The backend returned an unsuccessful response code. 
        // The response body may contain clues as to what went wrong, 
        console.log(`Backend returned code ${err.status}, body was: ${err.error.message}`); 
       } 
       return Observable.throw(err); 
      }) 
      .do(event => { 
       console.log(event); 
       if (event instanceof HttpResponse) { 
        console.log(event.body); 
       } 
      }); 
    } 

} 

インターセプタは機能していますが、エラーが呼び出し元の関数で読み取ることができない、それは常にnullです。

キャッチコードが迎撃に削除された場合、エラーが帰ってきた機能

this.http.post<Asset>(`whatever.php`, {}).subscribe(
    _data => console.log(data), 
    _err => console.log(_err) // <- this _err is always NULL 
); 

を呼び出します。インターセプタにジェネリックハンドリングをさせたいが、必要に応じて呼び出し関数がエラーを処理できるようにする。出来ますか?

答えて

0
return next.handle(req).do(
     (event: HttpEvent <any>) => { 
     if (event instanceof HttpResponse) { 
      console.log('--> event: ', event); 
      console.log('--> status: ', event.status); 
      this._spinnerService.requestEnded(); 
     } 
     }, 
     (err: any) => { <-- The error is caught here. You didn't define any Error callback, hence it's null during your subscription. 
     if (err instanceof HttpErrorResponse) { 
      console.log('--> error: ', err); 
      console.log('--> errorStatus: ', err.status); 
      this._spinnerService.requestEnded(); 
     } 
     } 
    ); 

私は私の元のコードでobservable.throwを返さなかった私の答え

+0

でコメントを確認してください。あなたは正しいコードがどのようにすべきかを分かち合いますか?どうも! – JeffChan

+0

do演算子は、Success、Error、Completeコールバックの3つのコールバックを返すsubscribe演算子とほぼ同じです。インターセプタを実装する正しい方法は、.do(成功=> {}、エラー?=> {}、完了=> {})です。呼び出し関数がインターセプタからエラーをキャッチするようにするには、do演算子にErrorコールバックを渡す必要があります。リクエストが実際にサーバーに到達する前にエラーがキャッチされてスローされるため、呼び出し関数のエラーをログに記録することはありません。つまり、データもNULL /未定義です。データを取得した場合は、エラーがないことを意味し、オペレータは実行します –

関連する問題