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
);
を呼び出します。インターセプタにジェネリックハンドリングをさせたいが、必要に応じて呼び出し関数がエラーを処理できるようにする。出来ますか?
でコメントを確認してください。あなたは正しいコードがどのようにすべきかを分かち合いますか?どうも! – JeffChan
do演算子は、Success、Error、Completeコールバックの3つのコールバックを返すsubscribe演算子とほぼ同じです。インターセプタを実装する正しい方法は、.do(成功=> {}、エラー?=> {}、完了=> {})です。呼び出し関数がインターセプタからエラーをキャッチするようにするには、do演算子にErrorコールバックを渡す必要があります。リクエストが実際にサーバーに到達する前にエラーがキャッチされてスローされるため、呼び出し関数のエラーをログに記録することはありません。つまり、データもNULL /未定義です。データを取得した場合は、エラーがないことを意味し、オペレータは実行します –