2017-08-12 65 views
0

我正在尋找通用的方式來處理角度js中的所有http錯誤。 我不想處理每個控制器上的錯誤以顯示錯誤消息。Angular Js中的REST調用的全局錯誤處理

我知道我們可以使用泛型異常處理程序,並且在我的應用程序中使用了攔截器,但目前它只處理「未授權」失敗並重定向到登錄頁面。 但對於其他故障,我不想重定向但只顯示錯誤消息。

如何使用泛型異常處理程序在UI上爲每個屏幕顯示來自服務器的錯誤消息?

+0

這很好,但我應該如何顯示錯誤消息從服務器的每個UI屏幕從該.catch處理程序? –

+0

你想讓用戶體驗什麼?用戶輕視模式對話的破壞性中斷。 – georgeawg

+0

用戶應該知道他們在服務器上的操作失敗,例如,由於應用程序中的電子郵件ID重複導致用戶創建失敗,因此我應該如何顯示來自該服務器的錯誤消息.catch處理程序中的每個UI屏幕? –

回答

0

您可以使用interceptors來處理這個問題:

app.service('APIInterceptor', ['$rootScope', '$window', '$q', function($window, $q) { 
    this.responseError = function(response) { 
     if (response.status === 401 || response.status === 403) { 
      $window.location.href = '/'; 

      return ̶$̶q̶.̶r̶e̶j̶e̶c̶t̶(̶ response; 
     } else if (response.status === 500) { 
      $rootScope.$emit("appError", new Error('An error occurred')); 

      return; 
     } 

     return ̶$̶q̶.̶r̶e̶s̶o̶l̶v̶e̶ $q.reject(response); 
    }; 
}]); 

app.config(['$routeProvider', '$httpProvider', function($routeProvider, $httpProvider) { 
    $httpProvider.interceptors.push('APIInterceptor'); 

// Some code here... 

}]); 

app.controller('MyController', ['$rootScope', '$scope', '$http', function($rootScope, $scope, $http) { 
    $scope.errorMessage = ''; 

    $rootScope.$on('appError', function(e, error) { 
     // Event details 
     console.log(e); 

     // Error object from interceptor 
     console.log(error); 
     $scope.errorMessage = error.message; 
    }); 
}]); 

檢查AngularJS $http Service API Reference以獲取更多信息。

+0

這很好,但我應該如何顯示從$ q.reject(響應)每個UI屏幕服務器的錯誤消息?我應該在每個屏幕上保留ng-model =「errorMsg」,並在該攔截器中設置$ rootScope.errorMsg?在這種情況下,我需要在屏幕導航或其他方法中重置errorMsg變量? –

+0

您不應該在$ rootScope中需要errorMsg;你的控制器可以有一個errorMsg和它的$ scope,你可以在處理錯誤後設置它。有關更多詳細信息,請查看[AngularJS with global $ http error handling](https://stackoverflow.com/a/37449792/5395709)上的答案。 – mscheker

+0

但我不希望我的控制器來處理錯誤。我正在尋找更多可維護的代碼,其中全局異常句柄發出錯誤消息,並且當前UI屏幕收聽並顯示錯誤消息。 –