2017-09-13 31 views
1

我想在Meteor和React框架内建立一个简单的登录表单。用户管理在应用程序的其他地方完成,所以我尝试使用Meteors的loginWithPassword功能。流星 - loginWithPassword只是无所成就

export default class Login extends React.Component{ 

constructor(props){ 
    super(props); 
} 
render() { 
    return (

     <div id="login"> 
      <form method="POST" id="loginForm" className="boxCont"> 
       <div> 
        <label>Username</label> 
        <input id="mail" type="text" name="mail" placeholder="Please enter your username here"/> 
       </div> 
       <div> 
        <label>Password</label> 
        <input id="password" type="password" name="password" placeholder="And your password here"/> 
       </div> 
       <div> 
        <button id="signIn" onClick={() => this.handleLogin()} name="signIn" className="btn left">Sign In</button> 
       </div> 
      </form><a id="forgotpass" href="#">Forgot Your Password?</a> 
     </div> 
    ); 
} 
handleLogin(){ 
    Meteor.loginWithPassword({username: '[email protected]'}, 'test', function (err) { 
     console.log(err) 
    }); 

}} 

如果有错误出现在登录时,该功能似乎工作正确,与预期结果(“用户未找到”,“密码错误” ......)响应。 但是,如果给定的数据是正确的,那么既没有错误也没有定义Meteor.user或userId()。

我忘了加载帐户密码或流星所需的任何属性吗?

用户输入-Db就像上面写的一样。

//编辑:

我正在使用Flow-Router验证对特定路由的访问权限。

const exposed = FlowRouter.group({ name: 'exposed' }); 
const loggedIn = FlowRouter.group({ 
    name: 'loggedIn', 
    triggersEnter: [() => { 
      if (Meteor.loggingIn() || Meteor.userId()){ 
       FlowRouter.route = FlowRouter.current(); 
      } 
      if (FlowRouter.route.name === 'auth'){ 
       Session.set('redirectAfterLogin', FlowRouter.route.path); 
      } 
      FlowRouter.go('auth'); 
    }], 
}); 

Accounts.onLogin(() => { 
    console.log("onLogin") 
    redirect = Session.get('redirectAfterLogin'); 
    if (redirect !== '/auth'){ 
     FlowRouter.go(redirect) 
    } 
}); 
exposed.route('/auth', { 
    name: 'auth', action(params, queryParams){ 
     ReactLayout.render(Empty, { yield: <Login /> }); 
    } 
}); 
exposed.route('/', { 
    name: 'Dashboard', action(params, queryParams){ 
     ReactLayout.render(App, { yield: <Dashboard /> }); 
    } 
}); 

根据流星文档,onLogin方法应该在loginWithPassword被触发后调用。 我从下面的教程这些内容摘要:

https://medium.com/@satyavh/using-flow-router-for-authentication-ba7bb2644f42

+0

https://docs.meteor.com/api/accounts.html#Meteor-loginWithPassword 用户对象或字符串 将字符串解释为用户名或电子邮件;或具有单个键的对象:电子邮件,用户名或ID。用户名或电子邮件匹配不区分大小写。 ({email:'[email protected]'},'test',function(err) ''' –

+0

感谢您的快速响应。我用一组电子邮件进行了尝试,如果其中一个参数不正确/无法找到,我会得到预期的错误,如果两者都正确,则什么也不会发生(即使accounts.login方法未触发)。 – Bl3g3

+0

如果你使用'console.log(Meteor.user())',它会打印什么?? –

回答

0

我猜,什么都不会发生,因为你没有要求它做任何事情。

你不应该做这样的事情

this.setState({loggedIn: true}) 

这将触发组件重新渲染,并在您的渲染方法,你应该做这样的事情:

render() { 
    if (this.state.loggedIn) 
    return <Redirect to="/dashboard" /> 

假设你是使用React Router v4和重定向组件(比history.push()好)

+0

我实际上在上面提到的教程中使用了流路由器。如果我正确理解Accounts-docs,那么应该通过loginWithPassword()自动设置meteor.user,不是吗? – Bl3g3