Маршрутизация на домашний экран, когда вы не вошли в систему

Я хочу перенаправить всех пользователей на домашнюю страницу, если они не вошли в систему. В настоящее время я делаю это:

Router.onBeforeAction(function() {
  this.render('loading');
  if (! Meteor.userId()) {
    this.render('Home');
  } else {
    this.next();
  }
});

Который я видел онлайн, но это, кажется, мешает моему 'loading' шаблон из когда-либо показывал и вместо этого показывает по умолчанию

Loading...

в левом верхнем углу экрана. Если я изменю this.render('Home'); в this.redirect('/') Я вижу правильный шаблон загрузки. Однако в '/' маршрут я называю другим this.render('Home') который я думаю, тогда вызывает onBeforeAction опять же, который в свою очередь будет перенаправлять на '/' Это означает, что вы находитесь в бесконечном цикле загрузки.

Итак, как правильно исправить мой Router.onBeforeAction чтобы достичь желаемой цели, чтобы пользователи, которые не вошли в систему, могли видеть только Home шаблон независимо от того, какой URL они вводят и делают это, не испортив мой пользовательский шаблон загрузки в другом месте на сайте?

2 ответа

Решение

Вам нужно иметь два перед крючками. Один из них предназначен для "загрузки", а второй - для проверки входа пользователя в систему.

"Загрузочный" связан с вашими подписками и обычно представляет собой предустановленный хук с железным маршрутизатором.

Router.onBeforeAction(function() {
  if (! Meteor.userId()) {
    this.render('Home');
  } else {
    this.next();
  }
}, {except: ['route_one', 'route_two']});

Router.onBeforeAction('loading');

Ваш маршрут:

Router.route('/', {
    name: 'home',
    subscriptions: function() { 
        //Array of Meteor.subscribe to wait for and display the loading template
        return [Meteor.subscribe("a_subscription")]
    },
    loadingTemplate: 'loading',
    action: function() {
        this.render("Home_logged_in");
    }
});

Так вот, если Meteor.subscribe("a_subscription") загружается это будет отображать loading шаблон. Если пользователь вошел в систему, он будет отображать Home_logged_in шаблон и если не вошли (на любом маршруте) Home шаблон.

Вы также можете установить исключения, используя имена "route_one" и "route_two" для своих шаблонов (которые вы можете переименовать во что-нибудь еще). Я назвал ваш домашний шаблон home, Но если вы добавили home к except перечислите, что onBeforeAction не будет применяться к home,

Я использую это onBeforeAction Хук, который перенаправляет на домашнюю страницу, если пользователь не вошел в систему:

var userAuthHook = function() {
  if (Meteor.userId()) {
    //continue to the requested url
    this.next();
  } else {
    //redirect to home
    this.redirect('/');
  }
};

Router.onBeforeAction(userAuthHook, {
  except: ['home']
});

Router.route('/', {
  name: 'home'
});

Обратите внимание, что я исключаю домашнюю страницу из ловушки, чтобы избежать циклов перенаправления и что / Маршрут называется "домом", который будет упоминаться в исключениях хуков.

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

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