使用Iron路由器可以像这样添加钩子:
// 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
但是文档没有说明如何使这些钩子成为“服务器端”。
我们的想法是创建一个钩子来监督所有路线的发布集合,除了一两条特定路线,我希望能更好地控制已发布的路线。
答案 0 :(得分:4)
Iron Router在客户端和服务器上都是一样的,声明可以在客户端和服务器都可用的目录/文件上完成。
默认情况下,声明的路由是针对客户端的。如果您希望路由成为服务器端,那么您可以通过包含where: 'server'
来明确声明。
在服务器和客户端上定义路由和配置路由器几乎完全相同。缺省情况下,路由创建为客户端路由。您可以通过为路径提供where属性来指定路由是否适用于服务器:
Router.map(function () {
this.route('serverRoute', {
where: 'server',
action: function () {
// some special server side properties are available here
}
});
});
请注意,必须放在Router.map中,而不是放在控制器上。
服务器操作函数(RouteControllers)具有不同的属性和方法。即,服务器上还没有渲染。因此渲染方法不可用。此外,您无法等待订阅或在服务器上调用wait方法。服务器路由获取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']});
或
Router.before(someOtherFilter, {except: ['clientRoute3', 'clientRoute4', 'serverRoute2']});
就像你平常一样。