2

ユーザーに「オペレーター」の役割が必要なアプリのセクションを書いています。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.userId() は OK を返します)、呼び出しの結果は にMeteor.user()なりますが、データベースを見ても明らかですユーザーにはオペレーターの役割があります。undefinedRoles.userIsInRolefalse

ユーザーのサブスクリプションは、triggersEnter が実行された時点では利用できないと思います。つまり、ユーザーのコレクションがクライアントに公開されていません。リンクをクリックしてルートにアクセスすると userIsInRole の結果は問題ありませんが、ページを更新すると問題が説明されるため、このような感じがします。これがサーバーでのみ発生する理由と、修正方法を知りたいです。

4

2 に答える 2

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 で個々のサブスクリプションを処理する方法を確認してください

于 2016-01-12T19:57:51.740 に答える
1

その理由は、FlowRouterがテンプレートのレンダリングをブロックしておらず、コレクションがサブスクライブさtriggersEnterれる前に役割をチェックするためです。Roles解決策はFlowRouter.wait()、アプリの初期化で使用し、グローバル サブスクリプションを作成してRoles(グローバルである必要があります - テンプレート レベルに関連付けられていない) コレクションを作成FlowRouter.initialize()し、準備ができたら呼び出すことです。

そうすれば、FlowRouter はコレクションを待機し、チェックの準備が整った後に初期化されます。

アップデート

localhost では、ローカル データベースとアプリの間のレイテンシが大幅に短縮されます。アプリがデプロイされると、クライアントがデータベースからデータをフェッチするのにより多くの時間がかかります。その結果、localhost では FlowRouter の初期化時にコレクションの準備が整い、デプロイされたアプリでは準備ができていません。

于 2016-06-14T14:04:31.017 に答える