流星铁路路由器服务器端挂钩
-
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-钩子
但是文档没有说如何使这些钩子“服务器侧”。
这个想法是创建一个钩子,除了一个或两个特定路由,除了我想要更多地控制发布的内容之外,它将监督所有路由的钩子。
解决方案
Iron路由器在客户端和服务器上都是相同的,并且可以在客户端和服务器上使用的目录/文件上完成声明。
默认情况下,声明的路由适用于客户端。如果您希望路由成为服务器端,那么您明确声明如此通过包括where: 'server'
。
从官方文档
定义路由和配置路由器在服务器和客户端上几乎相同。默认情况下,路由将创建为客户端路由。您可以指定通过提供这样的路由的属性来指定服务器的路由:
Router.map(function () {
this.route('serverRoute', {
where: 'server',
action: function () {
// some special server side properties are available here
}
});
});
.
请注意,必须放在路由器上的位置。
服务器操作功能(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']});
.
就像你一样。
不隶属于 StackOverflow