Meteor:在创建帐户之前,检查Meteor.users集合中不存在电子邮件

时间:2015-03-25 11:08:37

标签: javascript meteor

我有一个表单,用户可以将其电子邮件地址和密码输入到联接表单中。这创建了帐户,但我现在想进一步开发它。

client.js:

Template.joinForm.events({
    'submit .form-join': function(e, t) {
        e.preventDefault();
        var email = t.find('#email').value,
        password = t.find('#password').value,
        username = Random.id(),
        array = [],
        profile = {
            nameOfArray: array
        };
        Accounts.createUser({
            email: email,
            username: username,
            password: password,
            profile: profile
        }, function(error) {
            if (error) {
                alert(error);
            } else {
                Router.go('/');
            }
        });
    }
});

创建用户帐户之前,你是怎么做的:

  1. 检查email集合中是否已存在来自joinForm的Meteor.users变量。在服务器上处理这个?

  2. 如果确实存在email,则拒绝用户创建?

  3. 我看过新功能并想知道我是否可以使用此http://docs.meteor.com/#/full/accounts_validatenewuser

    Accounts.validateNewUser(function (user) {
        // pseudo if statement code
        if (email not exist) {
            // 1. create the user account and then
            Accounts.sendVerificationEmail(userId, [email])
        } else {
            throw new Meteor.Error(403, "email address is already registered");
        }
    });
    

    感谢您阅读本文。

    我不清楚是使用Accounts.createUser还是Accounts.onCreateUser以及哪些代码应该在客户端上,哪些代码应该在服务器< / em>的。我的目标是安全地构建帐户,因此,在此过程中从控制台拒绝任何其他修改权限。

4 个答案:

答案 0 :(得分:5)

现在,在服务器上创建额外的空数组nameOfArray,如果允许创建帐户,即传递validateNewUser功能。当然,您可以添加更多验证检查,例如密码长度。

client.js:

Template.joinForm.events({
    'submit .form-join': function(e, t) {
        e.preventDefault();
        var email = t.find('#email').value,
            password = t.find('#password').value,
            username = Random.id();
        Accounts.createUser({
            email: email,
            username: username,
            password: password,
            profile: profile
        }, function(error) {
            if (error) {
                alert(error.reason);
            } else {
                Router.go('/');
            }
        });
    }
});

server.js:

Accounts.onCreateUser(function(options, user) {
    var newEmail = user.emails[0].address;
    console.log(newEmail);
    var emailAlreadyExist = Meteor.users
        .find({"emails.address": newEmail}, {limit: 1})
        .count() > 0;
    console.log(emailAlreadyExist + ' already exists');
    if (emailAlreadyExist === true) {
        throw new Meteor.Error(403, "email already registered");
    } else {
        profile = options.profile;
        profile.nameOfArray = [];
        user.profile = profile;
        return user;
    }
});

答案 1 :(得分:3)

我发现Accounts.createUser内置了自己的验证并检查现有的电子邮件/登录信息。

Meteor docs: Accounts.createUser:

  

如果现有用户只有不同的用户名或电子邮件   case,createUser将失败。

如果Accounts.onCreateUser电子邮件/登录验证错误,Accounts.createUser甚至无法触发。

答案 2 :(得分:1)

Accounts.validateNewUser功能要求用户在提交后验证其电子邮件。它基本上就是这样一步,在您注册某些内容之后,在您登录之前,您必须输入在您的电子邮件或移动设备上发送给您的代码 - 基本上,它确保了用户就是他们所说的人。这可能会阻止您注册电子邮件totallyfake@totally_not_a_real_place.com

如果我正确地阅读了您的问题,您就会更感兴趣的是查看电子邮件是否唯一,而不是查看用户是否真正拥有该电子邮件帐户。您可以使用在服务器上运行的Accounts.onCreateUser执行此操作:

  

每当创建新用户时调用。返回新的用户对象,或者抛出错误以中止创建。

完整的过程看起来像这样。在客户端,正是你拥有的:

Template.joinForm.events({
'submit .form-join': function(e, t) {
    e.preventDefault();
    var email = t.find('#email').value,
        password = t.find('#password').value,
        username = Random.id(),
        array = [],
        profile = {
            nameOfArray: array
        };

    Accounts.createUser({
        email: email,
        username: username,
        password: password,
        profile: profile
    }, function(error) {
        if (error) {
            alert(error);
        } else {
            Router.go('/');
        }
    });
    }
});

然后,在服务器上,在实际创建用户之前,它将通过onCreateUser函数运行用户,并且您返回的任何内容都将插入到users集合中:

Accounts.onCreateUser(function(options, user) { 
  var email = user.emails[0];
  if (!email) { throw new Meteor.Error("You must provide a non-empty email"); // this may actually not be necessary -- createUser might do it for you
  if (Meteor.users.find({emails: email}) { 
    throw new Meteor.Error("A user with email " + email + " already exists!"); 
  }

  ... // whatever other transformation you might want
  return user; 
});

您也可以查看accounts-ui package,因为根据您想要做多少而不同于用户帐户的香草实现,可能已经为您做了很多。

答案 3 :(得分:0)

Accounts.validateNewUser用于检查用户对象的字段是否符合所需格式,并相应地返回true或false。

要检查电子邮件是否已注册,我认为您应该在Accounts.onCreateUser函数(http://docs.meteor.com/#/full/accounts_oncreateuser)中包含此验证。

如果没有测试代码,您可以尝试这样的事情:

Accounts.validateNewUser(function (user) {
     // Check compliance of the user object fields, using check http://docs.meteor.com/#/full/check
});

Accounts.onCreateUser(function(options, user) {
       if (options.profile){
          user.profile = options.profile;
       }

       if (Meteor.users.find({email: user.email}).fetch == 0) {
           if(Accounts.validateNewUser(user)){
                Accounts.sendVerificationEmail(userId, [email]);
                return user;
           } else {
               throw new Meteor.Error(403, "Error checking user fields");
       } else {
         throw new Meteor.Error(403, "email address is already registered");
       }       
 }