Roles.userIsInRole返回FALSE - Meteor

时间:2017-06-04 20:25:59

标签: javascript meteor meteor-accounts

我正在FlowRouter使用FlowTemplateboth/router/router.js我正在检查角色admin中的用户:

....
action: function () {
    if(Roles.userIsInRole(Meteor.userId(), 'admin')){
        FlowLayout.render('layout', {
            sidebar: 'sidebar', main:'admin', cart:'cart'
        })
    } else {
        FlowLayout.render('layout', {
            sidebar: 'sidebar', main:'unauthorised', cart:'cart'
        })
    }

    console.log(Meteor.userId());

}
....

并返回FALSE,但当我在WEB控制台中使用它时TRUE。此行console.log(Meteor.userId());输出正确的userID,当我登录时,如果我在WEB控制台Roles.userIsInRole(Meteor.userId(), 'admin')中执行此操作,则为TRUE。如果我执行此操作Meteor.user().roles,则结果为['admin']

如果我签入模板,那么用户是角色:

{{#if isInRole 'admin' }}
    ADMIN
{{/if}}

它是TRUE,但在router.js返回FALSE

如何解决?

2 个答案:

答案 0 :(得分:2)

可能会在稍后阶段收到roles字段(基于不同的订阅)。

您应确保此订阅已准备就绪 - 直接或通过使用其他一些机制来确保您获取该字段(例如确保它是一个数组),然后才进行路由/呈现决策

答案 1 :(得分:1)

是的,听起来像我遇到的时间问题。我必须解决的2种竞争条件(一种是使用AccountsTemplates,另一种是角色已经准备好)。它在这里讨论过:

https://github.com/kadirahq/flow-router/issues/608

这是我的解决方案。它位于routes.js的顶部:

import {Tracker} from 'meteor/tracker';

if (Meteor.isClient) {
    FlowRouter.wait();

    let tracker;
    let self = this;

    self.getATReady = () => AccountsTemplates._initialized;

    let timer = Meteor.setInterval(function() {
        if (self.getATReady()) {
            tracker.invalidate();
            clearInterval(timer);
        }
    }, 500);

    tracker = Tracker.autorun(function() {
        if (!FlowRouter._initialized && Roles.subscription.ready() && self.getATReady()) {
            clearInterval(timer);
            FlowRouter.initialize();
        }
    });
}

基本上,此代码会阻止FlowRouter的初始化,直到角色和AccountsTemplates都准备就绪。一旦他们准备就绪,FR就会被初始化,你可以使用你的路线知道你可以检查角色。

自2016年8月以来,我已经在几个Meteor版本中解决了这个问题,并且我没有看到问题再次发生。