流星用户始终在客户端未定义

时间:2018-11-02 20:21:57

标签: javascript meteor

我有一个问题,我是MeteorJS的新手,认为我需要一些帮助。我实施了电子邮件帐户验证。接下来,我想登录用户,但前提是用户已验证。这是问题所在,因为客户端中始终未定义Meteor.user()。您能帮我解释一下我做错了什么吗?

class App extends Component {
constructor(props){ 
    super(props);

    this.state = {
        verified: this.props.currentUser.emails[0].verified
    };
}

render(){

    return (
        <div>
            <Navbar collapseOnSelect fluid>
                <nav className="sideBar-menu">
                    <div className="pull-right sidebar-right">
                        <ButtonToolbar className="pull-left sidebar-toolbar">
                            {!this.state.verified && <Button>Sign in</Button>}
                            {this.state.verified && <Button>Sign out</Button>}
                            <Button bsStyle="danger">Sign up</Button>
                        </ButtonToolbar>                    
                    </div>
                </nav>
            </Navbar>            
        </div>
    )
  }
}

const dataHOC = withTracker((props)=>{
   return {
      currentUser: Meteor.user()
   }
})(App);

export default dataHOC

1 个答案:

答案 0 :(得分:2)

Meteor.user()仅在当前用户登录后返回当前用户的对象。因此,如果没有用户登录,则无法使用currentUser上的属性。

因此,您的状态可以使用两个值进行登录和验证:

 const currentUser = this.props.currentUser
 this.state = {
   loggedIn: currentUser,
   verified: currentUser && currentUser.emails[0].verified
 };

如果没有登录状态,渲染代码将显示sign-in元素:

<ButtonToolbar className="pull-left sidebar-toolbar">
  {!this.state.loggedIn && <Button>Sign in</Button>}          
  { this.state.loggedIn && <Button>Sign out</Button>}
  <Button bsStyle="danger">Sign up</Button>
</ButtonToolbar>  

然后,您可以使用verified显示更多信息,例如有关您的用户尚未验证的通知,并仅显示已验证用户的内容。

安全说明:请注意,这全都是UI糖果,如果您确实想防止未经验证的用户订阅数据或调用某些方法/更新数据,则应始终检查{{ 1}}中的方法和出版物。