代码之家  ›  专栏  ›  技术社区  ›  Sam R. chikka.anddev

AngularJS“localStorage.getItem”在$resource中为空

  •  4
  • Sam R. chikka.anddev  · 技术社区  · 9 年前

    我有一个棱角分明的 $resource 用于登录和获取用户信息。登录将用户名和密码发送到服务器,并获得Bearer令牌。在 success 功能 User.login 令牌存储在 localStorage 在里面 getEmail ,我将令牌包含在用户电子邮件地址的标头中。

    问题是,第一次 获取电子邮件 在控制器中调用, $window.localStorage.getItem('TK') 计算结果为 null 但如果我刷新了页面,它就会正常工作。对包含令牌的服务器的所有后续请求都按预期工作。是什么原因导致的?

    更不用说, 获取电子邮件 在登录后调用,并且我已确认令牌存在于 本地存储 获取电子邮件 被调用。

    angular.module('authentication')
        .factory('User', function ($resource, $window) {
            return $resource('/login', {}, {
                login: {
                    method: 'POST'
                },
    
                getEmail: {
                    url: '/user',
                    method: 'GET',
                    headers: {
                        'Authorization': "Bearer " + $window.localStorage.getItem('TK')
                    }
                }
            });
        })
    

    回应@comment: 我的控制器如下所示:

    angular
            .module('app.mymodule', ['ngReource', 'authentication')
            .controller('myCtrl', mymodule);
    
        mymodule.$inject = ['User', '$window'];
    
        function mymodule(User, $window) {
    
            // THIS PRINTS THE TK IN CONSOLE CORRECTLY
            console.log($window.localStorage.getItem("CHTOKEN"));
    
            // THIS IS UNAUTHORIZED CUZ TK IS NULL
            User.getEmail({}, function(data){
                    console.log('set the email');
            });
        }
    
    1 回复  |  直到 9 年前
        1
  •  4
  •   Phil Moon    9 年前

    您的问题是在创建时(在保存令牌之前)提供了资源定义。

    您可以添加常规 request interceptor $httpProvider 所以所有请求都包含在内,或者更改您的 getEmail 行动的 header 使用函数以便在运行时对其求值,例如

    headers: {
        'Authorization': function() {
            var token = $window.localStorage.getItem('TK');
            return token ? 'Bearer ' + token : null;
        }
    }