Meteor железный роутер-маршрутизатор серверные крюки
-
21-12-2019 - |
Вопрос
Использование железного маршрутизатора Можно добавлять такие крючки так:
// 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-Крючки
Но документация не говорит, как сделать эти крючки «Server Side».
Идея состоит в том, чтобы создать крючок, который будет контролировать издательские коллекции для всех маршрутов, за исключением одного или двух конкретных маршрутов, где я хочу больше контроля над тем, что публикуется.
Решение
Железный маршрутизатор - это то же, как на клиенте, так и на сервере, и и декларации могут быть выполнены в каталоге / файле, который доступен для клиента, так и сервера.
По умолчанию объявленные маршруты для клиента. Если вы хотите маршрут, чтобы быть на стороне сервера, вы явно заявляете, так как where: 'server'
.
Взятые из Официальные документы :
Определение маршрутов и настройка маршрутизатора практически идентична на сервере и клиенте. По умолчанию маршруты создаются как клиентские маршруты. Вы можете указать, что маршрут предназначен для сервера, предоставляя а в том, где свойство маршруту, как это:
Router.map(function () {
this.route('serverRoute', {
where: 'server',
action: function () {
// some special server side properties are available here
}
});
});
.
Обратите внимание, что где должны быть размещены в маршрутизаторе. Руководство, а не на контроллере.
Функции действия сервера (RouteControllers) имеют разные свойства и доступные способы. А именно, на сервере пока нет рендеринга. Таким образом, метод рендера недоступен. Кроме того, вы не можете выбрать подписки или вызовите метод ожидания на сервере. Серверные маршруты Получите голый запрос, ответ и следующие свойства запроса CONCEN, а также объекта параметров, как и в клиенте.
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']});
.
или
Router.before(someOtherFilter, {except: ['clientRoute3', 'clientRoute4', 'serverRoute2']});
.
Как вы обычно бы.