Meteor - 客户端和服务器中的Account.createUser

Luc*_*que 3 validation meteor

我理解在客户端和服务器中都有业务逻辑的原因,但我不清楚在某些情况下如何做到这一点.这里举例如下:

// 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");
        }
      });
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

由于验证仅在客户端上进行,因此可以轻松绕过它.但是这里有一个问题:这是由用户事件触发的,所以我不确定在客户端和服务器上运行此代码的最佳方法是什么.

Pat*_*fey 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
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

然后在客户端:

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
        }
      });
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

该代码是概念性的和未经测试的:)


小智 5

您应该使用Accounts.onCreateUser在服务器端执行此操作


Mat*_*our 5

以前的答案并不完全准确.

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

Accounts.config({
  forbidClientAccountCreation : true
});
Run Code Online (Sandbox Code Playgroud)

你可能想要研究一下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");
});
Run Code Online (Sandbox Code Playgroud)