Meteor.user() 使用 angular ui-router 和 alanning:roles 刷新时未定义

Meteor.user() undefined when refreshing using angular ui-router and alanning:roles

我在使用 meteor angular 以及包 ui-router 和 alanning:roles 开发应用程序时遇到了问题。在一个组件中,我不希望某个特定的路由只对某些角色下的登录用户可用,所以我配置了一个具有以下功能的组件:

function config($stateProvider) {
    'ngInject';

    $stateProvider.state('customers', {
        url: '/customers',
        template: '<customer-list></customer-list>',
        resolve: {
            currentUser($q) { 
                    const userId = Meteor.userId();
                    if (userId && Roles.userIsInRole(userId, ['admin'])) {
                        console.log('customers.USER_REJECTED');
                        return $q.reject('AUTH_REQUIRED');
                    } else {
                        console.log('customers.USER_ALLOWED');
                        return $q.resolve();
                    }
                }
            }
        })
    }

它工作得很好,但是当我刷新页面时,如果用户按照我已经实现的逻辑,则不允许访问该路由,即使他实际上已经登录了。如果那么我手动去到/customers,用户仍然不允许进入,但如果我去other url,那里唯一的requirement是要登录的,用户可以进入。我已经检查过,当我刷新页面时,Meteor.user() returns 未定义,所以我想这就是角色检查返回 false 的原因。我已经检查了这个社区中提出的几种解决方案,但我无法使它们中的任何一个发挥作用。你能帮我一下吗?

非常感谢。

这是一个时间问题,加载用户记录需要一些时间,并且路由在完成之前触发。

看看这个答案,它显示了我用来确保在路由解析之前完全加载用户记录的方法。

为了以后的人细读,我找到了另一种方法,这个方法附在angular-meteor包中:

resolve: {
        currentUser($meteor) {
            return $meteor.requireValidUser(function(user) {
                if (Roles.userIsInRole(user, ['admin'])) {
                    console.log('organisations.USER_ALLOWED');
                    return true;
                } else {
                    console.log('organisations.USER_REJECTED');
                    return 'AUTH_REQUIRED';
                }
            });
        }
    }

我使用了这个需要用户可用的函数,以及一个你可以传入以进行额外验证的额外函数。重要说明,在 angular-meteor 文档中,他们说这将在 1.4 中弃用,所以我仍然将以前的解决方案标记为好的解决方案。

此致,