Проверьте, существует ли пользователь на каждом маршруте с помощью Flow Router.

У меня есть профиль пользователя в Meteor.

Я использую Flow Router.

Я хочу проверить, существует ли пользователь на каждом маршруте.

я пытался

const userRedirect = ( context, redirect, stop ) => {
  let userId = FlowRouter.getParam( 'userId' );

  if ( Meteor.users.find( { _id: userId } ).count() === 0 ) {
   FlowRouter.go( 'userList' );
  }
};

const projectRoutes = FlowRouter.group( {
  name: 'user',
  triggersEnter: [ userRedirect ]
} );

userRoutes.route( '/users/:userId', {
  name: 'userDetail',
  action: function ( params, queryParams ) {
    BlazeLayout.render( 'default', { yield: 'userDetail' } );
  },
} );

но это не работает.

Я думаю, это потому, что я не подписался на коллекцию пользователей.

Как это сделать на маршруте? Должен ли я использовать

const userRedirect = ( context, redirect, stop ) => {
  let userId = FlowRouter.getParam( 'userId' );

  // subscribe to user
  Template.instance().subscribe( 'singleUser', userId );

  // check if found
  if ( Meteor.users.find( { _id: userId } ).count() === 0 ) {
   FlowRouter.go( 'userList' );
  }
};

Редактировать

Вместо этого я попытался проверить шаблон с помощью

Template.userDetail.onCreated( () => {
  var userId = FlowRouter.getParam( 'userId' );
  Template.instance().subscribe( 'singleUser', userId );
});

Template.userDetail.helpers( {
  user: function () {
    var userId = FlowRouter.getParam( 'userId' );
    var user = userId ? Meteor.users.findOne( userId ) : null;
    return user;
  },
} );

но он просто заполнит шаблон переменной user, которая является либо объектом пользователя, либо нулевым значением.

Я хочу использовать конфигурацию notFound, предлагаемую Flow Router для несуществующих маршрутов. Я предполагаю, что это также может быть применено к «несуществующим данным».

Таким образом, если путь маршрута равен /users/:userId, а пользователь с указанным идентификатором пользователя не существует, маршрутизатор должен интерпретировать маршрут как недопустимый путь.


person Jamgreen    schedule 06.11.2015    source источник
comment
вам нужно выполнить эти проверки на слое шаблона, поэтому на основном макете выполните проверки, вот хорошее руководство: kadira.io/academy/meteor-routing-guide/content/   -  person Mark Uretsky    schedule 06.11.2015
comment
Я прочитал руководство, но не вижу в нем упоминания о том, как использовать конфигурацию notFound в Flow Router. Я хочу, чтобы приложение показывало не найденный шаблон, когда пользователь не существует при доступе к маршрутам профиля.   -  person Jamgreen    schedule 06.11.2015


Ответы (1)


документация FlowRouter по логике аутентификации и разрешениям рекомендует контролировать, какой контент отображается для незарегистрированных пользователей по сравнению с зарегистрированными пользователями в ваших шаблонах, а не в самом маршрутизаторе. шаблоны железа-маршрутизатора обычно выполняют аутентификацию в маршрутизаторе.

Для вашего конкретного вопроса в вашем последнем вопросе:

html:

{{#if currentUser}}
  {{> yield}}
{{else}}
  {{> notFoundTemplate}}
{{/if}}

Чтобы перенаправить с помощью триггера, попробуйте что-нибудь вроде:

FlowRouter.route('/profile', {
  triggersEnter: [function(context, redirect) {
    if ( !Meteor.userId() ) redirect('/some-other-path');
  }]
});

Обратите внимание, что Meteor.userId() существует, даже если Meteor.user() еще не загружено.

документы

person Michel Floyd    schedule 07.11.2015
comment
Почему я не могу использовать для этого triggersEnter или что-то в этом роде? Прямо сейчас я проверяю, вошел ли пользователь в систему или нет в маршрутизаторе, но если у пользователя есть и стена, и информационная страница, и галерея, и т. д. (точно так же, как на Facebook), мне нужен какой-то умный способ проверить, пользователь вообще существует, прежде чем пытаться получить данные об этом пользователе. - person Jamgreen; 08.11.2015