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来擦除该值。这是一个很好的解决方案!很容易忘记工厂是在出生时实例化的,错误消息可以隐藏真正的问题!