我的AngularJS应用程序有一个$ http拦截,用于检查从任何api调用返回的401并重定向到登录状态。这在任何地方都有效,除了以下内容:
我有一个有决心的州。基本上,在进入“用户详细信息”页面之前,我想先加载用户:
.state('main.userdetails', {
url: 'users/{uid}',
templateUrl: 'views/user-details.html',
controller: 'UserDetailsCtrl',
controllerAs: 'ud',
resolve: {
user: ['userService', '$stateParams', function(userService, $stateParams) {
console.log('-- Resolver User called---' + $stateParams.uid)
return userService.getOne($stateParams.uid);
}]
}})
如果我登录该站点,然后从LocalStorage删除我的令牌,当我浏览到任何进行API调用的$状态时,我被重定向到登录页面。但是,当我浏览到上述状态时,我会看到“用户详细信息”页面,其中包含空白信息。在控制台中,我可以看到拦截器已被调用,但我没有被重定向。
在userService.getOne()中:
userFactory.getOne = function(id) {
user = {};
return $http.get(config.apiURL() + '/users/' + id)
.then(function(res) {
user = res.data;
return user;
}, function(error) {
console.log('Error GETing in userservice');
return error;
})};
我的拦截器的响应错误:
responseError: function(rejection) {
if (rejection.status === 401) {
console.log('--Auth Interceptor: responseError---');
authToken.removeToken();
$location.path('/login');
console.log('---Auth Interceptor: sent to /login');
}
return $q.reject(rejection);}
控制台告诉我这个:
--- Resolver User called---user1@test.com
GET http://test.com:3030/api/users/user1@test.com 401 (Unauthorized)
---Auth Interceptor: responseError---
---Auth Interceptor: sent to /login
Error GETing in userservice
---UserDetailsCtrl Entered---
显然,所有内容都按正确的顺序执行,但$location.path('/login')
并未做任何事情。
我做错了什么?
答案 0 :(得分:0)
但是,当我浏览到上述状态时,我会看到“用户详细信息”页面,其中包含空白信息。
那是因为你的错误处理程序
function(error) {
console.log('Error GETing in userservice');
return error;
}
返回error
,这实际上是拒绝原因,即普通字符串,并将该字符串作为user
的值传递给控制器。由于您从错误处理程序返回有效字符串,因此它假定已处理错误。为了避免这种假设,您可以从错误处理程序中throw
发生错误,或者再次返回被拒绝的承诺。