【问题标题】:AngularJS get current user from backend - error interceptorAngularJS 从后端获取当前用户 - 错误拦截器
【发布时间】:2015-12-11 15:03:50
【问题描述】:

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

我现在的问题是如何处理这种情况。是否可以在 getCurrentUser() 中强制 errorInterceptor- 调用或如何处理?

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);
        }
    }
}

})();

【问题讨论】:

  • 你的问题不清楚。请详细说明。

标签: angularjs error-handling


【解决方案1】:

当您的 .success 方法中有空数据时,您似乎没有解析您的 deffered

试试这个:

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

【讨论】:

    【解决方案2】:

    我已添加此代码:

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

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

    function getCurrentUser() {
            if (currentUser) {
                return $q.when(currentUser);
            }
        var resp = 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;
           });
    
        if(resp.$$state.status == 0) {
            $location.path('/signin')
        }
    
        return resp;
        };
    
    function getCurrentUserFromAPI() {
            return $http.get(api_config.BASE_URL + '/getCurrentLoggedUser');
        }
    

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 2014-11-02
      • 2021-09-18
      • 2020-02-23
      • 2021-07-03
      • 2019-11-24
      • 2023-03-17
      • 2014-06-07
      • 1970-01-01
      相关资源
      最近更新 更多