Meteor的createUser在客户端和服务器上运行

Meteor的createUser在客户端和服务器上运行

问题描述:

我对Meteor很陌生并试图理解它的概念。下面我有一个客户端代码触发流星方法来创建新用户:Meteor的createUser在客户端和服务器上运行

Template["signup-team"].onRendered(function(){ 
    var validator = $('.signup-team-form').validate({ 
     submitHandler: function(event){ 
      var email = $('[name=email]').val(); 
      var password = $('[name=password]').val(); 
      Meteor.call('addNewUser', email, password, "team-captain", function(error, result) { 
       if (error){ 
        return alert(error.reason); 
       } 
       Router.go("complete-signup"); 
      }); 
     } 
    }); 
}); 

的方法被定义为客户端和服务器上运行。当在服务器上运行时,我希望它创建用户并将角色添加到帐户。在客户端,我想登录的用户。

Meteor.methods({ 
    addNewUser: function(email, password, role) { 
     check(email, String); 
     check(password, String); 

     if(Meteor.isClient){ 
      Accounts.createUser({ 
       email: email, 
       password: password, 
       profile: { 
        completed: false 
       } 
      }, function(error){ 
       if(error){ 
        console.log(error); // Output error if registration fails 
       } else { 
        console.log(Meteor.userId()); 
       } 
      }); 
     } else { 
      var id = Accounts.createUser({ 
       email: email, 
       password: password, 
       profile: { 
        completed: false 
       } 
      }); 
      console.log(id); 
      Roles.addUsersToRoles(id, role);    
     } 
    } 
}); 

服务器部分运行正常,并创建新的用户,但在客户端,我得到错误Error: No result from call to createUser和用户不会自动登录。

我假设问题是我不需要在客户端上运行createUser,而是使用Meteor.loginWithPassword来代替,但我真的很想知道背后的理论。谢谢

+0

您很可能不希望客户端告诉您要向用户添加哪些角色。更好的方法是使用[Accounts.onCreateUser](http://docs.meteor.com/#/full/accounts_oncreateuser)。 – MasterAM

+0

是的,有效的点。谢谢 – MaximusDecimus

不要这样做。您正在重写核心代码并不必要地创建安全问题。

而不是使用您的addNewUser方法,只需拨打Accounts.createUser在客户端上。有一个onCreateUser回调句柄添加角色。

在您的代码中,您将以明文形式将用户密码发送到服务器。当您拨打Accounts.createUser时,password is hashed才被发送到服务器。它还负责为您登录新用户。虽然与添加角色

有一个问题,你将无法在onCreateUser回调使用Roles.addUsersToRoles(id, role),为用户对象尚未被添加到数据库中,并没有一个_id。然而,你可以将角色直接添加到相应的用户对象是这样的:

Accounts.onCreateUser(function(options, user) { 
    user.roles = ['team-captain'] 
    return user; 
}) 

话又说回来,也许你不希望所有用户都成为队长!

+0

谢谢@JeremyK,发送密码确实是一个坏主意。我认为Accounts.onCreateUser只能在服务器上调用。我如何通过我需要设置的角色? (不,并不是所有的用户都想成为队长J) – MaximusDecimus

+0

好吧,我已将角色附加到user.profile上,以便在服务器上读取它们,然后从对象中删除。 – MaximusDecimus