AngularJS从后端获取当前用户 - 错误拦截器

时间:2015-12-08 16:46:51

标签: angularjs error-handling

我有以下功能来获取登录用户。我不得不说我已经复制了教程中的代码 - 因此我不确切知道在后台发生了什么。 几分钟(20分钟)后没有请求令牌无效,如果调用getCurrentUser()我得到一个白色屏幕(来自后端的HTTP 401) - 我的错误拦截器$httpProvider.interceptors.push(errorInterceptor);未被调用

我现在的问题是如何处理这个案子。是否有可能在getCurrentUser()中强制errorInterceptor- invokation或如何处理它?<​​/ p>

function getCurrentUser() {
        var deferred = $q.defer();
        if(currentUser){
            deferred.resolve(currentUser);
        } else {
            getCurrentUserFromAPI().success(function(data) {
                if(data) {
                    currentUser = data;
                    return deferred.resolve(currentUser);
                }
            }).error(function(data) {
                var token = authTokenService.getToken();
                if(token) {
                    authTokenService.deleteToken();
                }
                return deferred.reject(data);
            });
        }
        return deferred.promise;
    }

[编辑]

这是我在底部的拦截器,我认为当后端响应错误时总是会调用errorResponse函数 - 例如HTTP 401,但是当调用函数 getCurrentUser 并且HTTP 401是来自服务器的响应时,不会调用此方法 - 因此我得到一个白屏。

其实我不知道该怎么做以防止这个白屏? 在这种情况下,我能做些什么吗?

(function() {
'use strict';

angular
    .module('myProject.error')
    .config(configure);

configure.$inject = ['$httpProvider'];

function configure($httpProvider) {
    $httpProvider.interceptors.push(errorInterceptor);

    ////////////

    function errorInterceptor($injector, $q, $location) {
        var interceptor = {
                responseError: responseError
        };

        return interceptor;

        ////////////

        function responseError(response) {
            alert('responseError')
            switch(response.status) {
            case ...
            }
            return $q.reject(response);
        }
    }
}

})();

2 个答案:

答案 0 :(得分:0)

当您的deffered方法中包含空数据时,您似乎无法解析.success

试试这个:

function getCurrentUser() {

    if (currentUser) return $q.when(currentUser);

    return getCurrentUserFromAPI(
               ).then(function(response) {
                       if (response.data) {
                           currentUser = response.data;
                           return currentUser;
                       } else {
                           currentUser = null;
                           throw null;
                       }     
                   },function(error) {
                       var token = authTokenService.getToken();
                       if (token) {
                           authTokenService.deleteToken();
                       };
                       throw error;
                   });
    };
};

弃用通知

.success服务现已弃用.error$http方法。而是使用.then.catch.finally方法。有关详细信息,请参阅AngularJS $http Service API Reference

答案 1 :(得分:0)

我已添加此代码:

msiexec.exe /qn /x "Borland CaliberRM 10.1.msi"

然后它工作到目前为止(exept我重新加载浏览器视图 - 然后我被重定向到登录页面)但实际上我不知道 resp。$$ state.status 是什么以及为什么它也是0.而且我也不知道为什么不调用函数(错误)函数(成功) - 当我在浏览器中成功调试并且错误回调不是调用。 也许有人确实对这个问题有了答案。

if(resp.$$state.status == 0) {
        $location.path('/signin')
    }