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
来代替,但我真的很想知道背后的理论。谢谢
不要这样做。您正在重写核心代码并不必要地创建安全问题。
而不是使用您的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;
})
话又说回来,也许你不希望所有用户都成为队长!
谢谢@JeremyK,发送密码确实是一个坏主意。我认为Accounts.onCreateUser只能在服务器上调用。我如何通过我需要设置的角色? (不,并不是所有的用户都想成为队长J) – MaximusDecimus
好吧,我已将角色附加到user.profile上,以便在服务器上读取它们,然后从对象中删除。 – MaximusDecimus
您很可能不希望客户端告诉您要向用户添加哪些角色。更好的方法是使用[Accounts.onCreateUser](http://docs.meteor.com/#/full/accounts_oncreateuser)。 – MasterAM
是的,有效的点。谢谢 – MaximusDecimus