2016-07-25 40 views
0

我正在使用useraccounts:unstyled,accounts-base,accounts-password并试图实现密码重置功能。密码重置令牌返回空值,尽管已定义

我有我的路线定义为这样:

FlowRouter.route('/reset-password/:token', { 
    name: 'reset-password', 
    onBeforeAction: function() 
    Accounts._resetPasswordToken = this.params.token; 
    this.next(); 
    }, 
    action(params){ 
    Accounts._resetPasswordToken = params.token; 
    mount(MainLayout, { 
     content: (<ForgotPassword />) 
    }); 
    } 
}); 

我的模板定义为这样:

<template name="ForgotPasswordModal"> 
    {{#if $not currentUser}} 
    <div class="forgot-modal {{$.Session.get 'nav-toggle'}}" id="{{checkState}}"> 
     <i class="fa fa-close resetPwd"></i> 
     {{> atForm}} 
    </div> 
    {{/if}} 
</template> 

我的辅助函数定义为:

if (Meteor.isClient) { 
    Template.ForgotPasswordModal.onCreated(function(){ 
    if(Accounts._resetPasswordToken){ 
     Session.set('resetPasswordToken', Accounts._resetPasswordToken); 
    }else{ 
     console.log("else"); 
    } 
    }); 

    Template.ForgotPasswordModal.helpers({ 
     checkState() { 
      return (AccountsTemplates.getState() == 'resetPwd') ? 'forgot-modal' : ''; 
     } 
    }); 

    Template.ForgotPasswordModal.events({ 
    "submit .at-btn": (event)=>{ 
     event.preventDefault(); 
     console.log(event); 
     password = document.getElementById('reset-password-new-password').value; 
     console.log("password", password); 
     if(password){ 
     Accounts.resetPassword(Session.get('resetPasswordToken'), password, (error)=>{ 
      if(error){ 
      console.log("error: ", error); 
      }else{ 
      console.log("success"); 
      Session.set('resetPasswordToken', null); 
      } 
     }); 
     } 
    } 
    }); 
} 

一旦点击提交我获得Error: Match error: Expected string, got null (unknown)

虽然如果我加载路由(使用有效令牌)并运行Session.get('resetPasswordToken')令牌有效地返回。

回答

0

请尝试使用这种方式: FlowRouter.route('/#/ reset-password /:token'); 这是重置密码的默认路由。

0

我得到这几天,无法弄清楚......然后经过一些重新安排,它终于工作。

而且您不必使用Meteor的默认路线&表单重设密码。

你剥夺妙蛙种子密切@Sleep,你的路线应该是这样的:

FlowRouter.route('/reset-password/:token', { 
    name: 'reset-password', 
    action(params){ 
    Session.set('_resetPasswordToken', params.token); 
    mount(MainLayout, { 
     content: (<ForgotPassword />) 
    }); 
    } 
}); 

我并不需要onBeforeAction,Accounts._resetPasswordToken,或this.next(),它工作得很好并自动登录。

你的模板应该是这样的:

if (!validateForm(password,passwordAgain)) { 
    console.log('Your passwords dont match'); 
} else if (!isValidPassword(password, passwordAgain)) { 
    console.log('You do not have valid passwords'); 
} else { 
    let token = Session.get('_resetPasswordToken'); 
    Accounts.resetPassword(token, password, function(err) { 
    check(token, String); 
    if (err) { 
     console.log('We are sorry but something went wrong.'); 
    } else { 
     console.log('Your password has been changed. Welcome back!'); 
    } 
    }); 
}