我正在编写我的应用的一部分,要求用户拥有'运营商'角色。
我在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
为Roles.userIsInRole
( Meteor.userId()返回ok),false
调用的结果为Could not import 'index'. The path must be fully qualified.
,虽然在数据库中查看用户是否具有操作员角色。
我认为在运行triggersEnter时,用户订阅不可用,这意味着用户集合未在客户端上发布。我有这种感觉,因为如果我通过点击链接访问路由userIsInRole结果是好的,但如果我刷新页面我得到描述的问题。 我想知道为什么这只发生在服务器上,我该如何解决它。
答案 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初始化时,您的集合已准备好,而在部署的应用程序上,它不是。