Серверные хуки Meteor Iron Router

Используя Iron router, можно добавить хуки следующим образом:

// this hook will run on almost all routes
Router.before(mustBeSignedIn, {except: ['login', 'signup', 'forgotPassword']});

// this hook will only run on certain routes
Router.before(mustBeAdmin, {only: ['adminDashboard', 'adminUsers', 'adminUsersEdit']});

См.: https://github.com/EventedMind/iron-router#using-hooks

Но в документации не сказано, как сделать эти хуки «на стороне сервера».

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


person demux    schedule 25.02.2014    source источник


Ответы (1)


Iron Router одинаков как на клиенте, так и на сервере, и объявления могут быть сделаны в каталоге/файле, который доступен как клиенту, так и серверу.

По умолчанию объявленные маршруты предназначены для клиента. Если вы хотите, чтобы маршрут был на стороне сервера, вы явно указываете это, включая where: 'server'.

Взято из официальной документации:

Определение маршрутов и настройка маршрутизатора практически идентичны на сервере и на клиенте. По умолчанию маршруты создаются как клиентские маршруты. Вы можете указать, что маршрут предназначен для сервера, указав свойство where для маршрута следующим образом:

Router.map(function () {
  this.route('serverRoute', {
    where: 'server',

    action: function () {
      // some special server side properties are available here
    }
  });
});

Обратите внимание, что where необходимо размещать в Router.map, а не на контроллере.

Функции действия сервера (RouteControllers) имеют различные доступные свойства и методы. А именно, рендеринга на сервере пока нет. Таким образом, метод рендеринга недоступен. Кроме того, вы не можете ждать подписки или вызывать метод ожидания на сервере. Маршруты сервера получают голый запрос, ответ и следующие свойства запроса Connect, а также объект params, как и в клиенте.

Router.map(function () {
  this.route('serverFile', {
    where: 'server',
    path: '/files/:filename',

    action: function () {
      var filename = this.params.filename;

      this.response.writeHead(200, {'Content-Type': 'text/html'});
      this.response.end('hello from server');
    }
  });
});

Как видите, существует только одно соглашение об именах, поэтому вы можете указать что-то вроде этого:

Router.before(someFilter, {only: ['clientRoute1', 'clientRoute2', 'serverRoute1']});

or

Router.before(someOtherFilter, {except: ['clientRoute3', 'clientRoute4', 'serverRoute2']});

как обычно.

person Serkan Durusoy    schedule 25.02.2014