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

Meteor user always undefined in client side

我有一个问题,我是 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

一旦用户登录,Meteor.user()只是returns当前用户的一个对象。因此,如果没有用户登录,您不能使用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-糖果,如果你真的想阻止未经验证的用户订阅数据或调用某些方法/更新数据,您应该始终检查方法和出版物中的 user.emails[i].verified