【问题标题】:How to make FlowRouter wait for users collection on the client如何让 FlowRouter 在客户端等待用户集合
【发布时间】:2016-01-12 19:00:29
【问题描述】:

我正在编写我的应用程序的一部分,它要求用户具有“操作员”角色。 我正在 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()undefined(Meteor.userId() 返回正常) ,而Roles.userIsInRole 调用的结果是false,尽管在数据库中查看很明显用户具有操作员角色。

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

【问题讨论】:

    标签: meteor flow-router


    【解决方案1】:

    原因是 FlowRouter triggersEnter 没有阻止模板渲染,它会在订阅 Roles 集合之前检查角色。解决方案是在应用程序初始化时使用FlowRouter.wait(),然后对Roles 进行全局订阅(您需要它是全局的-不绑定到模板级别)集合并在准备好时调用FlowRouter.initialize()

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

    更新

    在 localhost 上,本地数据库和应用程序之间的延迟要少得多。部署您的应用程序时,客户端需要更多时间从数据库中获取数据。结果在本地主机上,当 FlowRouter 初始化时,您的集合已准备就绪,而在已部署的应用程序上却没有。

    【讨论】:

    • 是的,但这会减慢页面加载速度。
    • 我已经删除了接受的答案标记,因为我没有得到关于“为什么它只发生在服务器上?”这个问题的任何答案
    • 这更像。我期待着那个答案。我想让它出现在公认的答案中,让它看起来更完整。
    • 你能放一个代码示例吗?我正在使用RolesFlowRouter,当您在地址栏上输入网址时它对我不起作用。
    【解决方案2】:

    使用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 了解如何处理个人订阅

    【讨论】:

    • 这不是我正在寻找的解决方案,我知道我可以在模板级别限制访问。或者这是我可以根据用户角色在页面上完成访问限制的唯一方法?还有,为什么这个问题只发生在服务器上?
    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多