Javascript 使用React with Meteor:如何在注销后处理Meteor.user()

Javascript 使用React with Meteor:如何在注销后处理Meteor.user(),javascript,meteor,reactjs,Javascript,Meteor,Reactjs,我的Meteor应用程序中有一个使用React组件构建的用户配置文件页面。因为它使用Meteor.user()创建一个变量,所以每当我注销应用程序时,我都会收到一个错误(但前提是我以前在当前会话中访问过配置文件页面)。这对我来说是有意义的,因为如果没有当前用户,Meteor.user()将不再可用,因此它将错误地显示“无法读取未定义的“支持”消息 最初,我尝试更改上述代码块,以将有问题的代码包装到if语句中,如下所示: AccountList = React.createClass({

我的Meteor应用程序中有一个使用React组件构建的用户配置文件页面。因为它使用Meteor.user()创建一个变量,所以每当我注销应用程序时,我都会收到一个错误(但前提是我以前在当前会话中访问过配置文件页面)。这对我来说是有意义的,因为如果没有当前用户,Meteor.user()将不再可用,因此它将错误地显示“无法读取未定义的“支持”消息

最初,我尝试更改上述代码块,以将有问题的代码包装到if语句中,如下所示:

AccountList = React.createClass({
    mixins: [ReactMeteorData],
    getMeteorData(){
        var user;
        if (Meteor.user()){
            var supportingUserId = Meteor.user().support.supportingUserId;
            supportingUserId ? user = Meteor.users.findOne({_id:  supportingUserId}) : user = Meteor.user();
            return {
                accounts: Accounts.find({owner: user._id}).fetch()
            }
        }
        else{
            return {};
        }
    }...
但我遇到了另一个错误:“无法读取未定义的属性‘length’”,这是由未定义的帐户引起的(从另一个需要进一步定义‘accounts’的呈现方法触发)。我最终采用了相同的方法,添加了一个额外的if语句,但遇到了另一个类似的错误。我的问题是,是否有可能解决这个问题,而不必将应用程序的一半封装在“if(Meteor.user())”语句中。或者,是否有可能让应用程序在注销时记住加载的React组件?

试试看

return {accounts: []};
而不是

return {};

千万不要以为Michel Floyd的方法是正确的

您可以在路由器中执行以下操作:

FlowRouter.route('/profile/edit', {
  name: 'profile.edit',
  triggersEnter: [function(context, redirect) {
    if(!Meteor.user()){
      console.log('User not logged in. Redirecting...');
      redirect('login');
    }
  }],
  action(params) {
    mount(FullLayout, {
      content: <ProfileEditComposer />
    });
  }
});
FlowRouter.route(“/profile/edit”{
名称:“profile.edit”,
triggersEnter:[函数(上下文,重定向){
如果(!Meteor.user()){
log('用户未登录。正在重定向…');
重定向(“登录”);
}
}],
行动(参数){
安装(完整布局{
内容:
});
}
});
(我在我的Meteor/React应用程序中使用FlowRouter,如果你使用另一种类型的路由器,代码会有点不同,但是,我相信应该是相同的想法)


以上代码行阻止未登录用户进入编辑配置文件页面并将其重定向到登录页面。通过这种方式,您不需要在Profile Edit组件或所有其他组件中更改代码,当这些组件试图通过用户对象访问和循环值时,这可能会产生很多错误—在本例中未定义。

如果您使用的是路由器,则通常会拒绝未登录用户访问需要用户信息的路由。在react中,您可能希望定义一个更高级别的类,如果有用户,它只包含所有依赖于用户的类,如果没有,则显示其他类。您应该能够避免在每一个类中对此进行防御。我已经拒绝了未登录用户的路由访问-当用户注销时,他们会返回主屏幕,但如果他们以前访问过配置文件页面,他们仍然会收到错误。你说的更高层次的课程是什么意思?你有一个可以分享的例子吗?谢谢,但问题并不是关于帐户的问题——更多的是关于如何避免在“if Meteor.user()”中包装代码块的问题。我正在寻找更多类似米歇尔·弗洛伊德(Michel Floyd)回答的东西(尽管我仍然难以实施这个建议)。
FlowRouter.route('/profile/edit', {
  name: 'profile.edit',
  triggersEnter: [function(context, redirect) {
    if(!Meteor.user()){
      console.log('User not logged in. Redirecting...');
      redirect('login');
    }
  }],
  action(params) {
    mount(FullLayout, {
      content: <ProfileEditComposer />
    });
  }
});