如何给用户集合添加额外的属性?

问题描述:

我正在使用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