Parse JS SDK登录不使用AngularJs ui路由保持当前用户信息
Parse JS SDK login does not keep the current user info using AngularJs ui routing
这是我的模块配置和运行:
angular.module('FXBApp', [
'ui.bootstrap'
,'ui.router'
,'oc.lazyLoad'
,'parse-angular'
]).
config(['$urlRouterProvider','$stateProvider', '$ocLazyLoadProvider',
function($urlRouterProvider,$stateProvider,$ocLazyLoadProvider) {
$ocLazyLoadProvider.config({
debug:false,
events:true
});
$urlRouterProvider.otherwise('/login');
$stateProvider
.state('login', {
url: "/login",
templateUrl: "views/login/login.html",
controller:'LoginCtrl',
resolve:{
loadMyFiles:function($ocLazyLoad){
return $ocLazyLoad.load({
name: 'FXBApp',
files: ['scripts/controllers/login.js']
})
}
}
})
.state('dashboard', {
url: "/dashboard",
templateUrl: "views/dashboard/main.html",
controller:'DashboardMainCtrl',
resolve:{
loadMyFiles:function($ocLazyLoad){
return $ocLazyLoad.load({
name: 'FXBApp',
files: [
'views/dashboard/dashboard.main.js'
,'views/dashboard/ribbon.js'
,'scripts/directives/sidebar/sidebar.js'
]
})
}
}
})
.state('dashboard.home', {
url: "/dashboard/home",
templateUrl: "views/dashboard/home.html",
controller:'DashboardHomeCtrl',
resolve:{
loadMyFiles:function($ocLazyLoad){
return $ocLazyLoad.load({
name: 'FXBApp',
files: [
'scripts/controllers/dashboard.home.js'
,'scripts/services/authentication.js'
,'scripts/directives/stats/stats.js'
,'scripts/services/dbstats.js'
]
})
}
}
})
run(['$rootScope','$state', function ($rootScope,$state) {
Parse.initialize("$$$$$$$", "######");
$rootScope.sessionUser ={};
$rootScope.isLoggedIn = function () {
if (!Parse.User.current()) $state.go('login');
};
$rootScope.logOut = function () {
Parse.User.logOut()
};
$rootScope.authUser = function (usr, pwd) {
//TODO: assure user is active and e-mail is verified
return Parse.User.logIn(usr,pwd).then(function (user) {
var qr = new Parse.Query(Parse.Role);
qr.equalTo('users', Parse.User.current().id);
return qr.first().then(function (e) {
try {
if (e.getName() != 'admin' && e.getName() != 'team_leader') {
return {err: true, userId: user.id, msg: 'User does not have permission to access'}
} else {
$rootScope.sessionUser = user;
return {err: false, userId: user.id}
}
} catch (e) {
return {err: true, userId: user.id, msg: 'User not assigned to any role--'+e}
}
}, function (e){
return {err: true, userId: user.id, msg:e.msg}
});
}, function (error) {
return {err:true,msg:error.message}
});
};
$rootScope.isLoggedIn()
}]);
正如你所看到的,我正在使用ui路由器和延迟加载来正确管理应用程序的性能。
一旦登录序列从使用$rootScope.authUser($scope.usr,$scope.pwd)
的登录控制器启动,如果我使用与此调用紧密相连的then()
,我就可以控制台显示当前用户的Parse.User.current()
。
登录后路由工作正常,棘手的部分是当我试图从成功登录后允许用户使用的parse.com类中获取数据时;它总是给出403错误。调查原因后,我发现Parse.User.current()
返回null,而$rootScope.sessionUser
保留了对登录用户的正确引用。
我尝试使用"Parse.Session.getSessionToken",但错误为"无当前用户"。我尝试使用Parse.User.become($rootScope.sessionUsr.getSessionToken())
,但情况变得更糟,因为现在我收到了无效会话令牌错误,必须转到chrome控制台从存储中删除解析sdk对象。
知道我做错了什么吗?
在发现问题的根本原因之前,我经历了漫长的旅程。它与Parse SDK无关,也与angular无关。它与一个显示注销按钮的指令有关(问题帖子中没有显示)。该指令调用doLogOut
$scope函数,该函数反过来使用Parse.User.logOut()
触发注销序列。
每次登录后加载此指令时,都会调用函数doLogOut
,从而清除Parse中的会话,并导致系统无法对数据库执行任何受限操作。
触发doLogout
而不是等待"ng click"事件的原因很简单,因为angular每次加载时都在评估$scope。这意味着它将在加载时评估"doLogOut",而不等待事件。将"doLogOut"更改为"doLogOut()"解决了此问题。
一个愚蠢的错误最终造成了许多复杂性。
- 访问布局信息是否也会导致浏览器重排
- Emberjs应用程序加载在除Index之外的所有路由上
- 正在使用$location.path(.)路由ng视图
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 定义完全独立的样式信息
- 使用html2canvas获取基本信息
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 从信息框调用弹出图像库
- 如何在不传递此信息的情况下查找被调用的元素
- 将谷歌自动完成地址信息放在页面上,而不是表格中
- 未激发路由的控制器属性上的观察者
- AngularJS ui路由器html5模式中断路由
- 如何通过解析类信息来使用jQuery创建类
- 发送json对象或使用express路由呈现视图
- Parse JS SDK登录不使用AngularJs ui路由保持当前用户信息
- 未捕获错误:无法加载路由模块(viewmodels/home/index).详细信息:'resourceName
- 嵌套的带有react路由器的详细信息路由未呈现
- 单击链接时,我如何定义导航到详细信息页面的路由
- 为TypeScript的路由-解决方法添加附加信息
- 如何使用 AngularJS 加载函数的信息并将其保存在路由中的解析范围内