0

useraccounts:unstyled、を利用してaccounts-baseaccounts-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')、トークンが有効に返されます。

4

2 に答える 2

0

私はこれを数日間手に入れていましたが、理解できませんでした...そして、いくつかの再配置の後、ようやく機能しました.

また、パスワードをリセットするために Meteor のデフォルト ルートとフォームを使用する必要はありません。

@Sleep Deprived Bulbasaur に近づいています。ルートは次のようになります。

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!');
    }
  });
}
于 2016-08-01T16:02:26.637 に答える
0

この方法を試してください: FlowRouter.route('/#/reset-password/:token'); これは、パスワードをリセットするためのデフォルト ルートです。

于 2016-07-26T05:59:13.217 に答える