更新MeteorJS帐户密码插件

时间:2015-10-25 08:33:32

标签: javascript meteor

我目前正在使用插件" accounts-password"通过命令

安装它
meteor add accounts-password

我已经运行了程序等,并且能够添加数据;但是,当我尝试使用

在浏览器上调用或显示数据时
{{ currentUser.email }}

{{ currentUser.password }}

它没有显示,但是当我打电话时

{{ currentUser.username }}

它运作得很好。我试图通过find()。fetch();来访问数据库。这就是我所看到的。

id: "GP26SF2F8jmpqQuvT"
emails: Array[1]
      0: Object
        address: "testing@gmail.com"
      verified: false
      __proto__: Object
      length: 1
__proto__: Array[0]
username: "testing"
__proto__: Object

根据安排,我应该将电子邮件称为

{{ currentUser.emails.0.address }}

?另外,我没有在数据中看到密码,有没有办法检索它?实际上我的目标是在用户想要更改密码或电子邮件地址时更新Meteor.users。感谢。

1 个答案:

答案 0 :(得分:2)

默认情况下,

accounts-password不会发布文档的password字段。这是出于预期 - 出于安全原因!

关于电子邮件:accounts包允许应用程序向用户添加多个电子邮件。这就是为什么会有一系列电子邮件。

而不是做

{{ currentUser.emails.0.address }}

您可以做的是为模板添加一个帮助器:

Template.myTemplate.helpers({
   email: function(){
       return Meteor.user().emails[0].address;
   }
}); 

然后你可以在模板中使用它:

{{ email }}
  

实际上我的目标是在用户想要更改密码或电子邮件地址时更新Meteor.users。感谢。

我说几乎没有理由将用户的密码发布到客户端。这是一个巨大的安全风险。 accounts-password包已经处理了常见的用例,因此您只需在客户端上使用Accounts.changePassword()即可允许用户更改其密码。

如果您想允许用户更改其电子邮件,您要执行的操作是使用Method。客户端可以调用方法,但代码在服务器上执行。执行完毕后,服务器会向客户端返回响应。有点像HTTP的工作方式。

在这种情况下,客户端可以调用名为changeEmail的方法,该方法会尝试更改用户的电子邮件。如果所有支票都通过等,则服务器会更改用户的电子邮件并返回响应,例如"success",否则返回"fail"。这就是代码的样子:

if(Meteor.isClient){
    Meteor.call('changeEmail', newEmail, function(error, response){
        if(error){
            console.error(error);
        } else {
            console.log(response);
        }
    });
}

if(Meteor.isServer){
    Meteor.methods({
        changeEmail: function(newEmail){
            Accounts.addEmail(this.userId, newEmail, false);
            var userEmails = Meteor.users.findOne(this.userId, {fields: {emails: 1}}).emails;
            if(userEmails.length > 1){
                Accounts.removeEmail(this.userId, userEmails[0].address);
                Accounts.sendVerificationEmail(this.userId, newEmail);
                return "success";
            } else {
                throw new Meteor.Error('fail', 'email not correct!');
            }
        }
    });
}

如果您不熟悉方法,可以阅读Meteor的this教程或this文章。此外,我的代码可能不是100%功能,它只是一个例子。