4

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

uncaught error extpected to find a document to change

在此处输入图像描述

正如你在法师中看到的

我订阅了用户记录

我的代码

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.

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

我在这里想念什么?

4

2 回答 2

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);
               }
        }
于 2014-12-23T09:48:30.357 回答
1

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

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

从文档中,它说

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

所以基本上,你也必须在事后订阅登录用户。有点傻,不过无所谓。

于 2015-12-10T16:49:48.977 回答