AngularJS:无法在$ resolve Intercept失败的情况下重定向内部解析

时间:2015-02-17 16:54:42

标签: angularjs angularjs-routing

我的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')并未做任何事情。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

  

但是,当我浏览到上述状态时,我会看到“用户详细信息”页面,其中包含空白信息。

那是因为你的错误处理程序

function(error) {
    console.log('Error GETing in userservice');
    return error;
}

返回error,这实际上是拒绝原因,即普通字符串,并将该字符串作为user的值传递给控制器​​。由于您从错误处理程序返回有效字符串,因此它假定已处理错误。为了避免这种假设,您可以从错误处理程序中throw发生错误,或者再次返回被拒绝的承诺。