2013-10-05 102 views
3

我了解在客户端和服务器端都具有业务逻辑的原因,但我不明白在某些情况下如何做到这一点。例如:客户端和服务器中的流星 - Account.createUser

// client/client.js 
// hnadling click event on the Create Accounts button 
Template.homecontent.events({ 
    'click #btnCreateAccount': function (event, template) { 
    var userEmail = template.find('#email').value, 
     userName = template.find('#newusername').value, 
     password = template.find('#newpassword').value, 
     password2 = template.find('#password2').value, 
     name  = template.find('#fullname').value; 

    validates = true; 
    //do some validation here 
    if(password != password2) { 
     validates = false; 
    } 

    if(validates === true) { 
     Accounts.createUser({ 
     username: userName, 
     email: userEmail, 
     password: password, 
     profile: { 
      name: name 
     } 
     }, function (error) { 
     if (error) { 
      console.log("Cannot create user"); 
     } 
     }); 
    } 
    } 
}); 

由于验证仅在客户端上进行,因此很容易被绕过。 但这里有一个问题:这是由用户事件触发的,所以我不确定在客户端&服务器上运行此代码的最佳方式是什么。

+0

退房这个问题,alredy与服务器/客户端代码来创建角色usere回答了这个问题,actally即时通讯使用我的网页上的代码,以创建用户希望它有助于[代码工作](http://stackoverflow.com/questions/27585020/meteorjs-useraccountscore-and-meteor-roles/27597448#27597448) – Ethaan

回答

8

您可能正在寻找类似于Meteor.methods();的东西,它允许您在服务器上定义客户端可以使用Meteor.call()调用的函数。您可以在服务器上提供验证功能和用户保存功能,并从客户端调用它们,传递表单数据。

我过去所做的是(在客户端)我有一个userFormParse()函数,它接受一个表单对象并将其解析为一个可传递到服务器端验证函数的对象。我为用户编辑和创建表单使用相同的userFormParse函数。

验证函数返回一个错误对象给客户端,或者,如果它是全部有效数据,我会将数据对象传递给一个userCreateWithRole函数(我通常总是将角色分配给用户)。

在服务器上:

Meteor.methods({ 
    'createUserWithRole': function(data, role) { 
    var userId; 

    Meteor.call('createUserNoRole', data, function(err, result) { 
     if (err) { 
     return err; 
     } 
     Roles.addUsersToRoles(result, role); 
     return userId = result; 
    }); 
    return userId; 
    }, 
    'createUserNoRole': function(data) { 
    //Do server side validation 
    return Accounts.createUser({ 
     email: data.email, 
     password: data.password, 
     profile: data.profile 
    }); 
    } 
}); 

然后在客户端上:

Template.userSignup.events({ 
    'submit #userSignup': function(event) { 
    var data, validationErrors; 
    event.preventDefault(); 
    data = userInputParse($(event.target)); //this function parses form into user object that can be inserted 
    validationErrors = userObjectValidate(data); //this function takes and does client side validation on the user object. 
    data.profile.status = 0; 
    if (validationErrors) { 
     //Show the user the validation errors 
    } else { 
     return Meteor.call('createUserWithRole', data, 'standard', function(err, userId) { 
     if (!err) { 
      //User created!! 
     } else { 
      //Insertion Error 
     } 
     }); 
    } 
    } 
}); 

该代码是概念性的和未经考验的:)

+0

帕特里克,任何机会,你可以共享该功能的代码?我只是想自己做一个工作。助教。 –

+1

完成! :)这是概念性代码 –

+1

这将通过电线发送明文密码,您应该像@Andrey建议的那样执行,并使用Accounts.onCreateUser()在服务器端添加验证。 – Gigo

4

以前的答案并不确切。

例如,创建和使用Meteor方法不会阻止用户从控制台调用Accounts.createUser。因此,您还需要防止在客户端上用户的创建:

Accounts.config({ 
    forbidClientAccountCreation : true 
}); 

你可能想看看Accounts.validateNewUser

示例(从文档拍摄):

Accounts.validateNewUser(function (user) { 
    if (user.username && user.username.length >= 3) 
    return true; 
    throw new Meteor.Error(403, "Username must have at least 3 characters"); 
});