我对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时,password is hashed将被发送到服务器。它还负责为您登录新用户。

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

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


再说一次,也许您不希望所有用户都成为团队队长!

关于javascript - meteor 的createUser在客户端和服务器上运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33541853/

10-10 05:38