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

Meteor's createUser running on client and server

本文关键字:客户端 服务器 运行 createUser Meteor      更新时间:2023-09-26

我是Meteor的新手,正在努力掌握它的概念。我在下面有一个客户端代码,它触发Meteor方法来创建新用户:

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时,密码在发送到服务器之前会被散列。它还负责为您登录新用户。

如果添加角色,您将无法在onCreateUser回调中使用Roles.addUsersToRoles(id, role),因为用户对象尚未添加到数据库中,并且没有_id。但是,您可以直接将角色添加到提议的用户对象中,如下所示:

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

再说一遍,也许你不希望所有用户都是队长!