Meteor在根级别向用户帐户添加其他字段

时间:2014-12-13 13:52:16

标签: meteor createuser

如何在用户集合中添加其他字段。我理解options对象允许四个字段 - 用户名,电子邮件密码和个人资料。所以在Accounts.onCreateUser上, 有没有办法在根级别添加其他字段(不在配置文件字段内)?

截至目前,解决方案是使用Accounts.createUser在配置文件中添加字段,将此字段复制到根级别,然后使用Accounts.onCreateUser删除配置文件中的字段。这是针对' userType'在我的下面的例子中

Client.js

Template.joinForm.events({
'submit .form-join': function(e, t) {
    e.preventDefault();
    var firstName = t.find('#firstName').value,
    lastName = t.find('#lastName').value,
    email = t.find('#email').value,
    password = t.find('#password').value,
    username = firstName + '.' + lastName,
    profile = {
            name: firstName + ' ' + lastName,
            userType: selectedUserType // this is copied to root level and deleted from profile.
};

    Accounts.createUser({
        //NEWFIELD1: [],
        //NEWFILED2: [],
        email: email,
        username: username,
        password: password,
        profile: profile
    }, function(error) {
        if (error) {
            alert(error);
        } else {
            Router.go('/');
        }
    });
}
});

server.js

Accounts.onCreateUser(function(options, user) {
if (options.profile) {
if (options.profile.userType) {
  user.userType = options.profile.userType;
  delete options.profile.userType;
}
user.profile = options.profile;
}
return user;
});

2 个答案:

答案 0 :(得分:4)

设置字段的唯一方法是在通过方法调用创建帐户后更新用户文档。例如:

客户端

var extraFields = {
  newField1: 'foo',
  newField2: 'bar'
};

Accounts.createUser(..., function(err1) {
  if (err1) {
    alert(err1);
  } else {
    Meteor.call('setUserFields', extraFields, function(err2) {
      if (err2) {
        alert(err2);
      } else {
        Router.go('/');
      }
    });
  }
});

服务器

Meteor.methods({
  setUserFields: function(extraFields) {
    // TODO: change this check to match your user schema
    check(extraFields, {
      newField1: Match.Optional(String),
      newField2: Match.Optional(String)
    });

    return Meteor.users.update(this.userId, {$set: extraFields});
  }
});

这种方法的主要问题是用户可以打开控制台并随时调用setUserFields方法。根据您的使用情况,这可能是也可能不是问题。您始终可以向方法添加其他检查,以防止在必要时进行后续更新。

答案 1 :(得分:1)

我已经能够在Accounts.onCreateUser上创建没有任何值(null)的其他字段。

请指出此解决方案的任何问题。 请务必发布其他字段。

server.js

Accounts.onCreateUser(function(options, user) {
if (options.profile) {
if (options.profile.userType) {
  user.userType = options.profile.userType;
  delete options.profile.userType;
  user.newfieldone = options.newfieldone; //this is the line to insert new field
  user.newfieldtwo = options.newfieldtwo;
}
user.profile = options.profile;
}
return user;
});


Meteor.publish(null, function() {
// automatically publish the userType for the connected user
// no subscription is necessary
return Meteor.users.find(this.userId, {fields: {newfieldone: 1, newfieldtwo: 1}});
});