为什么Meteor.user和Meteor.userId不同?

为什么Meteor.user和Meteor.userId不同?,meteor,iron-router,Meteor,Iron Router,我有一个拦截器: Router.onBeforeAction(function() { if (!Meteor.userId()) { console.log("lets login"); Router.go("login"); } else { this.next(); } }, { except: ['login', 'signup'] }); 它工作得很好,直到我更换了!Meteor.user()的Meteo

我有一个拦截器:

Router.onBeforeAction(function() {
    if (!Meteor.userId()) {
        console.log("lets login");
        Router.go("login");
    } else {
        this.next();
    }
}, {
    except: ['login', 'signup']
});
它工作得很好,直到我更换了!Meteor.user()的Meteor.userId()。似乎.user在刷新页面时未定义,并将其重定向到我的登录页面。我的登录路由器也会验证.user,这里就是正确的

为什么会有这种差异?

没错,Meteor.userId()返回id,而Meteor.user()返回对象

但是,由于异步问题,在脚本检查(!Meteor.user()){…}时,返回对象(Meteor.user())比仅返回ID要花费更多的时间,如果(!Meteor.user()){…},Meteor.user()尚未被处理和返回

因此,有几种方法可以解决该异步问题(例如,在Meteor/React应用程序中,我们可能有类似于订阅的东西,并等待句柄准备就绪)

没错,Meteor.userId()返回id,而Meteor.user()返回对象

但是,由于异步问题,在脚本检查(!Meteor.user()){…}时,返回对象(Meteor.user())比仅返回ID要花费更多的时间,如果(!Meteor.user()){…},Meteor.user()尚未被处理和返回


因此,有几种方法可以解决该异步问题(例如,在Meteor/React应用程序中,我们可能会使用类似subscribe的东西,并等待句柄准备就绪)

请参阅我的答案。Meteor.userId()返回当前用户id,Meteor.user()返回整个用户idobject@Nakib我知道,但这不是问题所在。我的如果!Meteor.user()也验证对象,但刷新后总是未定义。@DavidWeldon您的回答有道理,但这是一个bug吗?没有。您只需要首先更新被动变量,而登录+发布过程的机制使得
Meteor.user()
需要更长的时间才能获得正确的信息。请参阅我对.Meteor.userId()返回当前用户id和Meteor.user()返回整个用户id的回答object@Nakib我知道,但这不是问题所在。我的如果!Meteor.user()也验证对象,但刷新后总是未定义。@DavidWeldon您的回答有道理,但这是一个bug吗?没有。您只需要首先更新被动变量,登录+发布过程的机制使得
Meteor.user()
需要更长的时间才能获得正确的信息。