我正在寻找通用的方式来处理角度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屏幕? –