Javascript AngularJS“;localStorage.getItem";在$resource中为null

Javascript AngularJS“;localStorage.getItem";在$resource中为null,javascript,angularjs,local-storage,token,Javascript,Angularjs,Local Storage,Token,我有一个角度$resource用于登录和获取用户信息。登录名将用户名和密码发送到服务器,并获取一个承载令牌。在User.login的success功能中,令牌存储在localStorage中。在getEmail中,我在标题中将令牌包含到用户的电子邮件地址中 问题是,第一次在控制器中调用getEmail,$window.localStorage.getItem('TK')的计算结果为null,但如果我刷新页面,它就会正常工作。对包含令牌的服务器的所有后续请求都按预期工作。这是什么原因造成的 更不用

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

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

更不用说,
getEmail
是在登录后调用的,我在调用
getEmail
之前已经确认令牌存在于
localStorage

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

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

您可以将常规添加到
$httpProvider
以覆盖所有请求,也可以将
getEmail
操作的
标题更改为使用函数,以便在运行时对其进行评估,例如

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

只是想知道这是否是一个角度问题,如果您使用常规的
窗口而不是
$window
,会发生什么情况?@floribon,尝试一下。同样的问题,所以这和角度无关。不知何故,您的本地存储中没有数据,即使您认为有。即使在运行任何代码之前,您是否可以记录
window.localStorage.getItem('TK')
?如果为空,则angular将不起作用。@floribon,我已更新了我的问题。在调用
getEmail
之前,我已经记录了令牌,它会正确地将其打印到控制台。所以代币实际上就在那里。我甚至可以在我的FF开发工具中看到它。您首先要记录
CHTOKEN
项。然后在getEmail函数中检查
TK
。这是两个不同的项目,因此在调用getEmail之前没有任何迹象表明TK确实存在。如果它仍然存在,则意味着您可以在某个地方使用
localStorage.removietem
localStorage.clear来擦除该值。这是一个很好的解决方案!很容易忘记工厂是在出生时实例化的,错误消息可以隐藏真正的问题!