Parse JS SDK не сохраняет информацию о текущем пользователе, используя 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()
}]);

Как вы видите, я использую маршрутизатор пользовательского интерфейса, а также ленивую загрузку для правильного управления производительностью приложения.

Как только начнется последовательность входа в систему, с помощью контроллера входа используйте $rootScope.authUser($scope.usr,$scope.pwd)если я использую then() близко к этому вызову я могу утешить Parse.User.current() который показывает текущего пользователя.

Маршрутизация работает нормально после входа в систему, сложная часть - когда я пытался извлечь данные из класса parse.com, разрешенного для пользователя после успешного входа в систему; это всегда дает ошибку 403. Исследуя причину, я обнаружил, что Parse.User.current() возвращает ноль в то время как $rootScope.sessionUser содержит правильную ссылку на вошедшего в систему пользователя.

Я попытался использовать "Parse.Session.getSessionToken", и ошибка была "нет текущего пользователя". Я пытался с помощью Parse.User.become($rootScope.sessionUsr.getSessionToken()) но дела обстоят хуже, так как теперь я получаю ошибку недопустимого токена сеанса и должен перейти на консоль chrome, чтобы удалить синтаксический анализ объектов SDK из хранилища.

Есть идеи, что я сделал не так?

1 ответ

Был долгий путь, пока я не обнаружил причину своей проблемы. Это не было связано ни с Parse SDK, ни с угловым. Это было связано с директивой, которая показывает кнопку выхода из системы (не показана в сообщении о проблеме), которую вызывала эта директива doLogOut Функция $scope, которая, в свою очередь, запускала последовательность выхода, используя Parse.User.logOut(),

Каждый раз, когда эта директива загружает после входа в систему функцию doLogOut вызывался, что приводило к очистке сеанса в Parse и приводило к тому, что система не могла выполнять какие-либо ограниченные действия с БД.

Причина в том, что doLogout вместо ожидания 'ng-click' было вызвано то, что angular вычисляет $scope каждый раз, когда загружается. Это означает, что он будет оценивать "doLogOut" при загрузке и не ожидать события. Изменение doLogOut на doLogOut() решило проблему.

Глупая ошибка создала много сложностей к концу.

Другие вопросы по тегам