FlowRouter.go(redirect) запускается, но на самом деле не перенаправляет

FlowRouter.go(redirect); //gets triggered, but site does not actually redirect until refreshed.

Я следовал этому руководству, чтобы структурировать свои маршруты:

var authorised = FlowRouter.group();

var publicRoutes = FlowRouter.group();

FlowRouter.triggers.enter([isUserSignedIn]);

authorised.route('/',{
  name:'root',
  action(){
    BlazeLayout.render('App_body',{ main: 'App_home'});
  }
});

publicRoutes.route('/welcome',{
  name : 'welcome',
  action(){
    BlazeLayout.render('Unauthorised', { main: 'welcome' });
  }
});


function isUserSignedIn(){
  if (!Meteor.user() || Meteor.loggingIn()){
    var route = FlowRouter.current();
    if (route.path != "/welcome") {
      // Set Session to redirect path after login
      Session.set("redirectAfterLogin", route.path);
    }
    console.log("user is not signed in");
    FlowRouter.go('welcome');
  }
};

// Redirect After Login
Accounts.onLogin(function(){
  console.log("Accounts.onLogin()");
  var redirect = Session.get("redirectAfterLogin");
  if (redirect){
    console.log("redirect path exists")
    if(redirect != "/welcome"){
      console.log("redirect is not welcome path, redirect to ", redirect);
      FlowRouter.go(Session.get("redirectAfterLogin"));
    }
  }
  else{
    // if redirect doesn't exist, go "/"
    console.log("no redirection, go root");
    FlowRouter.go('root');
  }
})

// Not Found 
FlowRouter.notFound = {
  action() {
    BlazeLayout.render('Unauthorised', { main: 'App_notFound' });
  },
};

Приведенный выше код делает следующее:

Случай 1: Force Session.set("redirectAfterLogin", "/blah");

  1. Выход из приложения.
  2. Введите в консоли Session.set("redirectAfterLogin", "/blah");
  3. Авторизоваться
  4. Observe the following output in console:
    • Accounts.onLogin()
    • redirect path exists
    • redirect is not welcome path, redirect to /blah

Но я все еще на «Неавторизованном» макете с «приветственным» шаблоном».

  1. Нажимаю обновить, меня перенаправляет на "Не найдено" - это правильный результат.

Случай 2: Session.get("redirectAfterLogin") не определен

  1. Выход из приложения.
  2. Введите в консоли Session.set("redirectAfterLogin");
  3. Авторизоваться
  4. Observe the following output in console:
    • Accounts.onLogin()
    • no redirection, go root

Но я все еще на «Неавторизованном» макете с «приветственным» шаблоном».

  1. Нажимаю обновить, меня перенаправляет на "/" - это правильный результат.

Что именно мешает логике здесь? Пожалуйста помоги!


person user2587676    schedule 20.10.2017    source источник


Ответы (2)


У меня была эта проблема при попытке перенаправить после выхода из системы в событии:

'click .js-logout'() {
    Meteor.logout();

    FlowRouter.go('signin');
},

Мое быстрое решение состояло в том, чтобы добавить тайм-аут для вызова маршрутизатора:

'click .js-logout'() {
    Meteor.logout();

    // we have to do redirect a bit later because logout is interfering the redirection
    setTimeout( 
      () => {
        FlowRouter.go('signin');
      }, 100
    );
 },

Возможно, вы захотите увеличить время ожидания.

person Paweł C    schedule 17.11.2017
comment
Взгляните на мое решение выше, оно может помочь и вам! - person user2587676; 21.11.2017

Это было причиной моей проблемы, роли не были подписаны должным образом, и поэтому я застрял на макете unauthorised. Надеюсь, это поможет!

FlowRouter.wait()
// Tracker.autorun ->
//   # 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
//   if Roles.subscription.ready() and !FlowRouter._initialized
//      FlowRouter.initialize()
Tracker.autorun(function(){
  if (Roles.subscription.ready() && !FlowRouter._initialized){
    FlowRouter.initialize();
  }
});
person user2587676    schedule 21.11.2017