10

I'm creating new user with Accounts.createUser() and it works normally if you are not doing anything fancy. But I want to add some other fields to new user that are not listed on documentation. Here is my code:

var options = {
    username: "funnyUserNameHere",
    email: "username@liamg.com",
    password: "drowssap",
    profile: {
        name: "Real Name"
    },
    secretAttribute: "secretString"
};

var userId = Accounts.createUser(options);

In this example I have added secretAttribute to my options object. Because this is not documented it's just fair it's not adding my attribute under user object.

So I googled and figured out that something like this might work:

Accounts.onCreateUser(function(options, user) {
    if (options.secretAttribute)
        user.secretAttribute = options.secretAttribute;

    return user;
});

And yes! This works, but there is always BUTT.. *BUT.. After this one it's not saving profile anymore under the user object. However this makes it work:

Accounts.onCreateUser(function(options, user) {
    if (options.secretAttribute)
        user.secretAttribute = options.secretAttribute;

    if (options.profile)
        user.profile = options.profile;

    return user;
});

So what I want from you guys?

  1. I want to know why onCreateUser loses profile (before the fix above) in my case?
  2. Is my approach good practice?
  3. Is there better solution adding extra attributes for user object while creating them?

ps: I thinks it's obvious why I don't want to save all extra fields under profile ;)

lehtu
  • 868
  • 1
  • 12
  • 27

3 Answers3

5

Well it wasn't so hard.. Here it stands in documentation: "The default create user function simply copies options.profile into the new user document. Calling onCreateUser overrides the default hook." - Accounts.onCreateUser

lehtu
  • 868
  • 1
  • 12
  • 27
1

Try this:

Accounts.onCreateUser((options, user) => (Object.assign({}, user, options)));
Teng Zhang
  • 29
  • 2
  • 4
    Can you explain why this is a good solution to the problem instead of just providing code? – DVK Aug 02 '16 at 19:31
0

The best thing I found to this issue is:

Accounts.onCreateUser(function(options, user) {
    // Use provided profile in options, or create an empty object
    user.profile = options.profile || {};

    // Assigns first and last names to the newly created user object
    user.profile.firstName = options.firstName;
    user.profile.lastName = options.lastName;

    // Returns the user object
    return user;`enter code here`
});

https://medium.com/all-about-meteorjs/extending-meteor-users-300a6cb8e17f

Nats_Ayala
  • 199
  • 1
  • 5