Сеанс не определен — Meteor 1.4 и Flow Router

Я пытаюсь внедрить пользовательский вход, авторизацию и роли в свое приложение Meteor с помощью Flow Router. Я использую последнюю версию Meteor. Я также обновил все пакеты. Я получаю сообщение об ошибке при входе в систему.

Регистрация и создание аккаунтов работает отлично. Мои учетные данные сохранены, а пользователи созданы.

Я устанавливаю переменную сеанса в loggedIn.js, а затем извлекаю ее в configure.js, когда нажимается кнопка входа в систему, и «должен» направлять меня на желаемый маршрут, по которому я пытался перейти, прежде чем войти в систему, но я получаю это «Сеанс не определен " ошибка. Вот две ошибки, которые я получаю:

Exception in onLogin callback: TypeError: Cannot read property 'replace' of undefined
at Router.path (http://localhost:3000/packages/kadira_flow-router.js?hash=09ea12875d3801955ee70797bf8e4a70feebc570:325:18)
at Router.go (http://localhost:3000/packages/kadira_flow-router.js?hash=09ea12875d3801955ee70797bf8e4a70feebc570:360:19)
at http://localhost:3000/app/lib/routes/configure.js?hash=1ca98e9145d8b9d63189b16a8d872866175709b0:15:25
at runAndHandleExceptions (http://localhost:3000/packages/callback-hook.js?hash=fff7fdef0707c85900b21f766a4b6c65bf278ff4:162:24)
at http://localhost:3000/packages/callback-hook.js?hash=fff7fdef0707c85900b21f766a4b6c65bf278ff4:169:12
at http://localhost:3000/packages/accounts-base.js?hash=db584b046b0a64d03bfcbf1cd84a8b38f83ddc0d:290:9
at Hook.each (http://localhost:3000/packages/callback-hook.js?hash=fff7fdef0707c85900b21f766a4b6c65bf278ff4:138:15)
at http://localhost:3000/packages/accounts-base.js?hash=db584b046b0a64d03bfcbf1cd84a8b38f83ddc0d:289:25
at http://localhost:3000/packages/underscore.js?hash=27b3d669b418de8577518760446467e6ff429b1e:794:19
at loggedInAndDataReadyCallback (http://localhost:3000/packages/accounts-base.js?hash=db584b046b0a64d03bfcbf1cd84a8b38f83ddc0d:411:5)

И из строки cmd:

I20160818-21:36:28.962(-7)? Exception in onLogin callback: ReferenceError: Session is not defined
I20160818-21:36:29.266(-7)?     at app\lib\routes\configure.js:9:3
I20160818-21:36:29.267(-7)?     at runAndHandleExceptions      (packages/callback-hook/hook.js:133:1)
I20160818-21:36:29.267(-7)?     at packages/callback-hook/hook.js:140:1
I20160818-21:36:29.267(-7)?     at packages/accounts-   base/accounts_server.js:167:5
I20160818-21:36:29.267(-7)?     at [object Object]._.extend.each (packages/callback-hook/hook.js:109:1)
I20160818-21:36:29.267(-7)?     at AccountsServer.Ap._successfulLogin (packages/accounts-base/accounts_server.js:166:21)
I20160818-21:36:29.267(-7)?     at AccountsServer.Ap._attemptLogin (packages/accounts-base/accounts_server.js:356:10)
I20160818-21:36:29.267(-7)?     at [object Object].methods.login (packages/accounts-base/accounts_server.js:533:21)
I20160818-21:36:29.267(-7)?     at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1711:12)
I20160818-21:36:29.267(-7)?     at packages/ddp-server/livedata_server.js:711:19

Я удалял и повторно добавлял пакет Sessions несколько раз. Вот список всех пакетов, которые я сейчас использую:

[email protected]
twbs:[email protected]
fortawesome:fontawesome
[email protected]
okgrow:router-autoscroll
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
kadira:flow-router
meteorhacks:fast-render
kadira:blaze-layout
zimme:active-route
arillo:flow-router-helpers
[email protected]
alanning:roles
[email protected]
standard-minifier-css
standard-minifier-js
meteortoys:[email protected]
session

У меня есть 3 файла для Flow Router для разных маршрутов, которые я создал до сих пор.

В configure.js именно здесь начинается ошибка Session is not defined:

    Accounts.onLogin(function() { // This makes sure the user goes to the route that he wanted after he successfully logged in.

  var redirect = Session.get('redirectAfterLogin');
  console.log(redirect);
  if (redirect !== null) { // added this check here because some async behaviour in either FlowRouter or onLogin hook can cause wrong redirect to the ‘ login’ page again. This explicit check solves that issue.
    if (redirect !== '/login') {
      return FlowRouter.go(redirect);
    }
  }
});

В loggedIn.js я создал групповой маршрут для вошедших в систему пользовательских маршрутов:

var loggedIn = FlowRouter.group({
  name: loggedIn,
  triggersEnter: [ function() { //whenever someone enters a route in this group, the trigger will run before the route runs.
    var route;
    if (!(Meteor.loggingIn() || Meteor.userId())) { // Checks if the user is logging in or if the user is logged in already
      route = FlowRouter.current();
      if (route.route.name !== 'login') {
        Session.set('redirectAfterLogin', route.path); // we don’t use the route name, but the path. this way you can redirect the user while keeping the state in the url.
        console.log("this is the route path", route.path); // we save the route that the user wanted to go in Session.set('redirectAfterLogin')
      }
      FlowRouter.go('login');
    }
  }]
});

loggedIn.route('/admin', {
  name: 'mainLayout',
  action: function() {
    BlazeLayout.render( 'mainLayout' );
  }
});

loggedIn.route('/pageOne', {
    action: function() {
      BlazeLayout.render( 'mainLayout', {content: 'pageOne'});
    },
    name: 'pageOne'
});

loggedIn.route('/pageTwo', {
    action: function() {
      BlazeLayout.render( 'mainLayout', {content: 'pageTwo'});
    },
    name: 'pageTwo'
});

loggedIn.route('/logout', {
    name: 'logout',
    action: function () {
        Meteor.logout(function () {
            FlowRouter.go(FlowRouter.path('login'));
        });
    }
});

Вот мои открытые маршруты в exposed.js:

var exposed = FlowRouter.group ({
  name: exposed
});

exposed.route('/', {
    action: function() {
      BlazeLayout.render( 'landing' );
    },
    name: 'landing'
});

exposed.route('/login', {
    action: function() {
      BlazeLayout.render( 'login' );
    },
    name: 'login'
});

exposed.route('/register', {
    action: function() {
      BlazeLayout.render( 'register' );
    },
    name: 'register'
});

И последнее, но не менее важное: в папке автозагрузки у меня есть файл с именем default.js:

FlowRouter.wait();

//if the roles subscription is ready, start routing
//there are specific cases that this reruns, so we also check
// that FlowRouter hasn't initalized already

Tracker.autorun(function() {
  if (Roles.subscription.ready() && !FlowRouter._initialized) {
    return FlowRouter.initialize();
  }
});
// Run this when the meteor app is started
Meteor.startup(function () {

});

У кого-нибудь еще была эта проблема или что-то подобное? Любая помощь будет принята с благодарностью. Чтобы уточнить, сеансы установлены, и я использую последнюю версию 1.1.6. Спасибо


person Chase Isley    schedule 19.08.2016    source источник
comment
Вы решили проблему? Если нет, каков текущий статус?   -  person MasterAM    schedule 11.09.2016


Ответы (2)


Есть 2 отдельные проблемы:

  1. Сессия определяется только на клиенте, и нет смысла запускать код перенаправления на сервере (на сервере хук обычно используется для других целей, например, для аналитики). Это приводит к ошибке, которую вы видите в консоли.

  2. Вы передаете undefined в FlowRouter.go(), поскольку строго сравниваете возвращаемое значение сеанса с null. null и undefined не совпадают. Поэтому, если переменная сеанса 'redirectAfterLogin' не установлена, вы получите undefined и передадите ее FlowRouter.

person MasterAM    schedule 19.08.2016

Была аналогичная проблема. Решил следующим образом: В AccountsTemplates.configure прописал путь homeRoutePath: '/loggedin'. Таким образом, после входа в систему пользователь будет перенаправлен на маршрут ‘/loggedin’. Затем в FlowRouter для пути ‘/loggedin’:

loggedInGroup.route('/loggedin', {
    name: 'loggedin',
    triggersEnter: [function(context, redirect) {
        var redirectAfterLoginPath = Session.get('redirectAfterLogin');
        if(redirectAfterLoginPath){
            redirect(redirectAfterLoginPath);
            Session.set('redirectAfterLogin', undefined);
        } else {
            redirect('home');
        };
    }]
});

loggedInGroup = FlowRouter.group({
    triggersEnter: [
        function(context, redirect, stop) {
            if (Meteor.loggingIn() || Meteor.userId()) {
                route = FlowRouter.current();
            } else {
                if(context.path != '/sign-in'){
                    Session.set('redirectAfterLogin', context.path);
                };
                redirect('/sign-in');
            }
        }
    ]
});

Таким образом, маршрут «/loggedin» — это просто способ решения проблемы невозможности доступа к сеансу в Accounts.onLogin, и он перенаправляет пользователя на правильный маршрут.

person M. Pierzchlewicz    schedule 04.10.2016