我正在尋找通用的方式來處理角度js中的所有http錯誤。 我不想處理每個控制器上的錯誤以顯示錯誤消息。Angular Js中的REST調用的全局錯誤處理
我知道我們可以使用泛型異常處理程序,並且在我的應用程序中使用了攔截器,但目前它只處理「未授權」失敗並重定向到登錄頁面。 但對於其他故障,我不想重定向但只顯示錯誤消息。
如何使用泛型異常處理程序在UI上爲每個屏幕顯示來自服務器的錯誤消息?
我正在尋找通用的方式來處理角度js中的所有http錯誤。 我不想處理每個控制器上的錯誤以顯示錯誤消息。Angular Js中的REST調用的全局錯誤處理
我知道我們可以使用泛型異常處理程序,並且在我的應用程序中使用了攔截器,但目前它只處理「未授權」失敗並重定向到登錄頁面。 但對於其他故障,我不想重定向但只顯示錯誤消息。
如何使用泛型異常處理程序在UI上爲每個屏幕顯示來自服務器的錯誤消息?
您可以使用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以獲取更多信息。
這很好,但我應該如何顯示從$ q.reject(響應)每個UI屏幕服務器的錯誤消息?我應該在每個屏幕上保留ng-model =「errorMsg」,並在該攔截器中設置$ rootScope.errorMsg?在這種情況下,我需要在屏幕導航或其他方法中重置errorMsg變量? –
您不應該在$ rootScope中需要errorMsg;你的控制器可以有一個errorMsg和它的$ scope,你可以在處理錯誤後設置它。有關更多詳細信息,請查看[AngularJS with global $ http error handling](https://stackoverflow.com/a/37449792/5395709)上的答案。 – mscheker
但我不希望我的控制器來處理錯誤。我正在尋找更多可維護的代碼,其中全局異常句柄發出錯誤消息,並且當前UI屏幕收聽並顯示錯誤消息。 –
這很好,但我應該如何顯示錯誤消息從服務器的每個UI屏幕從該.catch處理程序? –
你想讓用戶體驗什麼?用戶輕視模式對話的破壞性中斷。 – georgeawg
用戶應該知道他們在服務器上的操作失敗,例如,由於應用程序中的電子郵件ID重複導致用戶創建失敗,因此我應該如何顯示來自該服務器的錯誤消息.catch處理程序中的每個UI屏幕? –