Angular9 處理請求錯誤

2020-07-06 14:54 更新

如果請求在服務器上失敗了,那么 HttpClient 就會返回一個錯誤對象而不是一個成功的響應對象。

執(zhí)行服務器請求的同一個服務中也應該執(zhí)行錯誤檢查、解釋和解析。

發(fā)生錯誤時,你可以獲取失敗的詳細信息,以便通知你的用戶。在某些情況下,你也可以自動重試該請求。

獲取錯誤詳情

當數據訪問失敗時,應用會給用戶提供有用的反饋。原始的錯誤對象作為反饋并不是特別有用。除了檢測到錯誤已經發(fā)生之外,還需要獲取錯誤詳細信息并使用這些細節(jié)來撰寫用戶友好的響應。

可能會出現兩種類型的錯誤。

服務器端可能會拒絕該請求,并返回狀態(tài)碼為 404500 的 HTTP 響應。這些是錯誤響應。

客戶端也可能出現問題,例如網絡錯誤會讓請求無法成功完成,或者 RxJS 操作符也會拋出異常。這些錯誤會產生 JavaScript 的 ErrorEvent 對象。

HttpClient 在其 HttpErrorResponse 中會捕獲兩種錯誤。你可以檢查一下這個響應是否存在錯誤。

下面的例子在之前定義的 ConfigService 中定義了一個錯誤處理程序。

Path:"app/config/config.service.ts (handleError)" 。

  1. private handleError(error: HttpErrorResponse) {
  2. if (error.error instanceof ErrorEvent) {
  3. // A client-side or network error occurred. Handle it accordingly.
  4. console.error('An error occurred:', error.error.message);
  5. } else {
  6. // The backend returned an unsuccessful response code.
  7. // The response body may contain clues as to what went wrong,
  8. console.error(
  9. `Backend returned code ${error.status}, ` +
  10. `body was: ${error.error}`);
  11. }
  12. // return an observable with a user-facing error message
  13. return throwError(
  14. 'Something bad happened; please try again later.');
  15. };

該處理程序會返回一個帶有用戶友好的錯誤信息的 RxJS ErrorObservable。下列代碼修改了 getConfig() 方法,它使用一個管道把 HttpClient.get() 調用返回的所有 Observable 發(fā)送給錯誤處理器。

Path:"app/config/config.service.ts (getConfig v.3 with error handler)" 。

  1. getConfig() {
  2. return this.http.get<Config>(this.configUrl)
  3. .pipe(
  4. catchError(this.handleError)
  5. );
  6. }

重試失敗的請求

有時候,錯誤只是臨時性的,只要重試就可能會自動消失。 比如,在移動端場景中可能會遇到網絡中斷的情況,只要重試一下就能拿到正確的結果。

RxJS 庫提供了幾個重試操作符。例如,retry() 操作符會自動重新訂閱一個失敗的 Observable 幾次。重新訂閱 HttpClient 方法會導致它重新發(fā)出 HTTP 請求。

下面的例子演示了如何在把一個失敗的請求傳給錯誤處理程序之前,先通過管道傳給 retry() 操作符。

Path:"app/config/config.service.ts (getConfig with retry)" 。

  1. getConfig() {
  2. return this.http.get<Config>(this.configUrl)
  3. .pipe(
  4. retry(3), // retry a failed request up to 3 times
  5. catchError(this.handleError) // then handle the error
  6. );
  7. }
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號