流星中的resetPassword问题

时间:2014-12-21 14:58:06

标签: meteor meteor-accounts

我向用户发送了注册电子邮件,当他输入密码和其他详细信息时,我试图重置密码但是却抛出了错误

uncaught error extpected to find a document to change

enter image description here

正如你在法师中看到的那样

我订阅了用户记录

我的代码

this.route('enroll', {
        path: '/enroll-account/:token',
        template: 'enroll_page',
        onBeforeAction: function() {
            Meteor.logout();
            Session.set('_resetPasswordToken', this.params.token);
            s = this.subscribe('enrolledUser', this.params.token).wait();
        }
    }),

在我显示表单和提交事件后

onSubmit: function(creds) {
            var options = {
                _id: Meteor.users.findOne()._id,
                name: creds.name
            }
            var token=Session.get('_resetPasswordToken');
            Meteor.call('updateUser', options, function(error, result) {
                if(!error) {
                    Accounts.resetPassword(token, creds.password, function(error) {
                        if (error) {
                            toastr.error("Sorry we could not update your password. Please try again.");
                            return false;
                        }
                        else{
                            toastr.error("Logged In");
                            Router.go('/');
                        }
                    });
                } else {
                    toastr.error("Sorry we could not update your password. Please try again.");
                    return false;
                }
            });
            this.resetForm();
            this.done();

            return false;
        }

一切正常,但resetpassword回调未触发,上述错误显示在控制台中。

我的令牌已从用户记录中删除,我可以使用登录表单登录,但

来自文档

Reset the password for a user using a token received in email. Logs the user in afterwards.

重置密码后我无法自动登录,上面的错误正在抛出

我在这里缺少什么?

2 个答案:

答案 0 :(得分:5)

this.subscribe('enrolledUser', this.params.token).wait();

这里您使用resetPassword令牌订阅

当您调用Accounts.resetPassword方法时,该方法将重置密码并从用户记录中删除令牌。

因此您的订阅将丢失,并且客户端中没有可用于修改的记录 (这是错误Expected to find a document to change

而是在第一次订阅时使用Id

保存用户ID并订阅用户记录

所以订阅不会丢失

path: '/enroll-account/:token',
        template: 'enroll_page',
        onBeforeAction: function() {
            Meteor.logout();
            Session.set('_resetPasswordToken', this.params.token);
            s = this.subscribe('enrolledUser', this.params.token).wait();
        },
        onAfterAction:function(){
               if(this.ready()){
                  var userid=Meteor.users.findOne()._id;
                  Meteor.subscribe("userRecord",userid);
               }
        }

答案 1 :(得分:1)

或者,您可以在出版物中执行以下操作。这对我有用(但我的查询比这更复杂)。

Meteor.publish('enrolledUser', function (token) {
  check(token, String);
  return Meteor.users.find({
    $or: [{
      _id: this.userId
    }, {
      'services.password.reset.token': token
    }]
  });
});

来自文档,它说

  

使用电子邮件中收到的令牌重置用户的密码。 之后将用户登录。

所以基本上,你必须在事后订阅登录用户。有点傻,但无论如何。