2017-11-30 11 views
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(); 
     } 
     } 
    ); 

확인 내 대답에 주석

+0

내 원래의 코드에서 observable.throw을 반환했다. 올바른 코드는 어떻게 공유해야할까요? 고마워! – JeffChan

+0

do 연산자는 성공, 오류 및 완료 콜백 등 3 콜백을 반환하는 가입 연산자와 거의 같습니다. 인터셉터를 구현하는 올바른 방법은 .do (성공 => {}, 오류? => {}, 완료 => {})입니다. 인터셉터에서 Calling 함수가 오류를 catch하도록하려면 do 연산자에 Error 콜백을 전달해야합니다. 요청이 실제로 서버에 도달하기 전에 오류가 발견되어 throw되기 때문에 호출 함수에서 오류를 기록하지 않습니다. 이는 데이터가 null/undefined이기도 함을 의미합니다. 데이터를 얻으면 오류가 없음을 의미하고 연산자가 실행됩니다. –