如何使FlowRouter等待客户端上的用户收集

时间:2016-01-12 19:00:30

标签: meteor flow-router

我正在编写我的应用的一部分,要求用户拥有'运营商'角色。 我在FlowRouter的triggersEnter函数中检查了这一点。我希望没有操作员角色的用户显示受限制的访问页面。

我使用FlowRouter,Roles和brettle:accounts-deluxe,每位访客自动登录。

以下是我的代码routes.js

FlowRouter.route('/switchboard', {
  name: 'switchboard',
  triggersEnter: [function (context, redirect, stop) {
    if (!Roles.userIsInRole(Meteor.userId(), ['operator'])) {
      BlazeLayout.render('main', {
        content: 'restrictedAccess'
      });           
      stop();
    }
  }],
  action: function () {
    BlazeLayout.render('main', {
        content: 'switchboard'
    });
  }
});

在localhost上一切正常工作,但是当使用mup部署应用程序时,在服务器上,triggersEnter运行Meteor.user()时,undefinedRoles.userIsInRole( Meteor.userId()返回ok),false调用的结果为Could not import 'index'. The path must be fully qualified. ,虽然在数据库中查看用户是否具有操作员角色。

我认为在运行triggersEnter时,用户订阅不可用,这意味着用户集合未在客户端上发布。我有这种感觉,因为如果我通过点击链接访问路由userIsInRole结果是好的,但如果我刷新页面我得到描述的问题。 我想知道为什么这只发生在服务器上,我该如何解决它。

2 个答案:

答案 0 :(得分:1)

使用Template.subscriptionsReady标志

<template name="blogPost">
  <a href="/">Back</a>
  {{#if Template.subscriptionsReady}}
    {{#with post}}
      <h3>{{title}}</h3>
      <p>{{content}}</p>
    {{/with}}
  {{else}}
      <p>Loading...</p>
  {{/if}}
</template>

点击此处查看完整文档: https://kadira.io/academy/meteor-routing-guide/content/subscriptions-and-data-management/with-blaze 了解如何处理个人订阅

答案 1 :(得分:1)

原因是FlowRouter triggersEnter不会阻止渲染模板,它会在订阅Roles个集合之前生成检查角色。解决方案是在app init上使用FlowRouter.wait(),然后为Roles创建全局订阅(您需要全局订阅 - 不依赖于模板级别)集合,并在准备就绪时调用FlowRouter.initialize()

这样FlowRouter将等待您的收集,并在准备好检查后进行初始化。

<强> 更新

在localhost上,本地数据库和应用程序之间的延迟要小得多。部署应用程序时,客户端需要更多时间从数据库中获取数据。在localhost上的结果中,当FlowRouter初始化时,您的集合已准备好,而在部署的应用程序上,它不是。