2017-08-12 35 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屏幕收听并显示错误消息。 –