Meteor:resetPassword电子邮件链接行为

Meteor:resetPassword电子邮件链接行为,meteor,password-recovery,Meteor,Password Recovery,我正在尝试在我的Meteor应用程序中实现重置密码功能。基于本教程,我有一个非常简单的实现: 有几个例子使用相同的基本方法。我做的几乎和朱利安的一模一样,但我只使用了一个模板;如果会话变量sResetPassword不是false,我在显示“重置密码”表单的模板中使用{{if}}。我不知道在Julien的示例中应该如何显示正确的模板,而且它在编写时对我不起作用-模板不会更改 下面是关键代码。两种不同的方法都适用于我的本地应用程序,但都不适用于我的托管应用程序 /* method one if (

我正在尝试在我的Meteor应用程序中实现重置密码功能。基于本教程,我有一个非常简单的实现:

有几个例子使用相同的基本方法。我做的几乎和朱利安的一模一样,但我只使用了一个模板;如果会话变量sResetPassword不是false,我在显示“重置密码”表单的模板中使用{{if}}。我不知道在Julien的示例中应该如何显示正确的模板,而且它在编写时对我不起作用-模板不会更改

下面是关键代码。两种不同的方法都适用于我的本地应用程序,但都不适用于我的托管应用程序

/* method one
if (Accounts._resetPasswordToken) {
  Session.set('sResetPassword', Accounts._resetPasswordToken);
}

/* method two
Accounts.onResetPasswordLink( function(token) { 
    Session.set('sResetPassword', token);  
});
在我部署的版本中,链接打开我的应用程序,直接进入开始屏幕。当我检查sResetPassword会话变量的值时,它是未定义的,因此不知何故,令牌的值永远不会被放入变量中


在我们讨论这个问题时,有人知道当您使用单独的模板进行重置密码表单时,应该如何加载正确的模板吗?

下面是它的工作原理。代码:

var token, done;

Accounts.onResetPasswordLink(function (t, d)
{
    token = t;
    done = d;
    setTimeout(()=>Router.go("reset_password"), 0);
});

Template["reset_password"].events({
    "click #resetBtn": function (event:Event, instance:Blaze.TemplateInstance)
    {
        var password1: string = instance.$("#input_password1").val();
        var password2: string = instance.$("#input_password2").val();
        console.log(password1, password2);
        if (password1 != password2)
        {
            return;
        }

        Accounts.resetPassword(token, password1, ()=>
        {
            done();
            Router.go("somewhere");
        });


    }
});
模板:

<template name="reset_password">
<form data-parsley-validate>
    <div class="input-field">
        <input id="input_password1" type="password" class="validate" data-parsley-trigger="keyup" data-parsley-minlength="6" data-parsley-minlength-message = "Please provide a password that is at least a 6 characters long." required>
        <label for="input_password1">New Password</label>
    </div>
    <div class="input-field">
        <input id="input_password2" type="password" class="validate" data-parsley-trigger="keyup" data-parsley-minlength="6" data-parsley-minlength-message = "Please provide a password that is at least a 6 characters long." required>
        <label for="input_password2">Again</label>
    </div>
    <button id="resetBtn" class="waves-effect btn">Reset Password</button>
</form>

好的,不管出于什么原因,用flow router替换iron router为我解决了这个问题。我创建了一个只有登录和重置密码功能的新应用程序,它运行良好。我添加了iron路由器,它再次工作,但只有开发模式。当我在生产模式下运行它时,问题又出现了。在测试应用程序和我的完整应用程序中用flow router替换了iron router,现在问题消失了。电子邮件链接在两种模式下都能正常工作。

谢谢,Michel H。查看您的代码后,我添加了一个用setTimeout包装的Router.go语句。有了这个改变,我确实在点击链接后短暂地看到了正确的模板。但随后该应用程序直接进入“开始”屏幕。所以我还在试验。顺便说一句,你的代码中有什么有趣的结构:=>吗?它不是为我编译的。它是一个类型脚本的东西,它保留了这个just use函数的外部属性。