如何给用户集合添加额外的属性?
问题描述:
我正在使用Accounts.createUser
向数据库添加新用户,但问题是并非所有属性都已添加。如何给用户集合添加额外的属性?
这里是我的代码来添加新用户:
import {Accounts} from 'meteor/accounts-base';
Template.addingUser.events({
'submit #addUser': function (e, t) {
e.preventDefault();
Session.set('name', t.find('#name').value);
Session.set('email', t.find('#email').value);
Session.set('telephoneOffice', t.find('#telephoneOffice').value);
Session.set('telephoneHouse', t.find('#telephoneHouse').value);
Session.set('salary', t.find('#salary').value);
let userId = Accounts.createUser({
username: Session.get('name'),
password: "123456",
email: Session.get('email'),
telephoneOffice: Session.get('telephoneOffice'),
telephoneHouse: Session.get('telephoneHouse'),
employeeSalary: Session.get('salary'),
annualLeave: 14
}, function (err) {
if (err)
console.log(err);
else
console.log('It worked...');
});
Accounts.sendEnrollmentEmail(userId);
}
});
只有姓名,电子邮件和密码被添加。
如何包含其他信息以及如telephoneOffice
?
答
您需要通过profile
对象内部的额外数据。
Accounts.createUser({
username: Session.get('name'),
password: "123456",
email: Session.get('email'),
profile: {
telephoneOffice: Session.get('telephoneOffice'),
telephoneHouse: Session.get('telephoneHouse'),
employeeSalary: Session.get('salary'),
annualLeave: 14
}
...
答
Accounts.createUser
不接受用户名,电子邮件,密码和配置文件之外的自定义参数。传递自定义用户信息的默认功能是传递这些字段,例如telephoneOffice
作为profile
对象的一部分,该对象被复制到插入到用户集合的文档中的user.profile
。
例如:
let userId = Accounts.createUser({
username: Session.get('name'),
password: "123456",
email: Session.get('email'),
profile: {
telephoneOffice: Session.get('telephoneOffice'),
telephoneHouse: Session.get('telephoneHouse'),
employeeSalary: Session.get('salary'),
annualLeave: 14
}
});
注意,user.profile
字段by default modifiable by users。所以这是遗留下来的,但Meteor实际上建议避免将它用于存储。
如果你想这些字段上user
而不是user.profile
,你可以做的是传递profile
对象如上上的自定义参数,可以再利用覆盖的Accounts.onCreateUser默认行为。事情是这样的:
Accounts.onCreateUser(function(options, user) {
if (options.profile)
_.extend(user, options.profile);
return user;
});
在这里看到更多的信息:https://guide.meteor.com/accounts.html#custom-user-data