3

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

// 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");
        }
      });
    }
  }
});

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

4

3 回答 3

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
        }
      });
    }
  }
});

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

于 2013-10-06T21:18:43.983 回答
5

您应该在服务器端使用Accounts.onCreateUser

于 2014-12-26T02:24:32.103 回答
5

以前的答案并不准确。

例如,创建和使用 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");
});
于 2015-05-13T21:04:14.137 回答