我想在我的Angular应用中创建一个通用的错误处理程序。
例如,我收到一封链接为:mysite/messages/151的邮件点击此邮件:如果我没有登录,我的框架返回一个403(故意的)。
所以我创建了这个工厂。目前,它只查找403错误,然后将用户路由到登录页面。
app.factory('httpRequestInterceptor', ['$q', '$location', '$rootScope', function($q, $location) {
return {
'responseError': function(rejection) {
if (rejection.status === 403) {
$location.path('/user/login');
return $q.reject(rejection);
}
}
};
}]);
在app.config中我添加了这一行:
app.config(['$httpProvider', function($httpProvider)
{
$httpProvider.interceptors.push('httpRequestInterceptor');
现在,当我得到一个403,我去正确的路径:/user/login到目前为止,一切顺利。
但是…我想以某种方式添加$state,这样我就知道调用url是什么(messages/151),这样我就可以返回到正确的位置并显示消息。
我不能在工厂中使用$state(错误是因为一些技术的东西,我还不理解($http vs $state?),所以现在我很困惑如何把事情做完。
所以,我想:
1)在URL出现403错误时进入登录状态(works)
2)从user (works)获取登录凭据3)登录后返回URL是ok的(不提示)
也许我应该用另一种方法,但是我不明白。希望有人能帮帮我?好了,这就是我想出来的。谢谢!
/**
* Error handling on httpRequests.
*
* generic: use rejection.status like: if (rejection.status === 403) {return $q.reject(rejection);}
* custom: check fromState['current']['name'] for state name
*
*/
app.factory('httpRequestInterceptor', ['$q', '$location', '$injector', '$timeout', '$stateParams', function($q, $location, $injector, $timeout, $stateParams) {
return {
'responseError': function(rejection) {
var fromState = $injector.get('$state');
$timeout(function() {
switch (fromState['current']['name']) {
case 'root.messages':
$injector.get('$state').go('root.login', $stateParams,
{location: false});
break;
}
}, 2000);
return $q.reject(rejection);
}
};
}]);
广播方法很好,但我们也可以通过以下方式做到这一点。如果你使用ui-router来处理路由请求,那么你可以使用这个:N您的授权服务:
// There is a positive point to use this, your router will not get loaded before authorization
// $stateChangeStart call before routing to other state
rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
if(!session.exists()){
// Unauthorize User
event.preventDefault();
state.go("error");
}else{
// Normal Flow
location.path(toState.url);
}
});