流星铁路由器服务器端挂钩

时间:2014-02-25 15:43:00

标签: javascript meteor iron-router

使用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

但是文档没有说明如何使这些钩子成为“服务器端”。

我们的想法是创建一个钩子来监督所有路线的发布集合,除了一两条特定路线,我希望能更好地控制已发布的路线。

1 个答案:

答案 0 :(得分:4)

Iron Router在客户端和服务器上都是一样的,声明可以在客户端和服务器都可用的目录/文件上完成。

默认情况下,声明的路由是针对客户端的。如果您希望路由成为服务器端,那么您可以通过包含where: 'server'来明确声明。

取自official docs

  

在服务器和客户端上定义路由和配置路由器几乎完全相同。缺省情况下,路由创建为客户端路由。您可以通过为路径提供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']});

就像你平常一样。