Accounts.onCreateUser добавляет дополнительные атрибуты при создании новых пользователей, передовой опыт?

Я создаю нового пользователя с помощью Accounts.createUser(), и он работает нормально, если вы не делая ничего необычного. Но я хочу добавить некоторые другие поля для нового пользователя, которые не указаны в документации. Вот мой код:

var options = {
    username: "funnyUserNameHere",
    email: "[email protected]",
    password: "drowssap",
    profile: {
        name: "Real Name"
    },
    secretAttribute: "secretString"
};

var userId = Accounts.createUser(options);

В этом примере я добавил secretAttribute к моему объекту параметров. Поскольку это не задокументировано, это просто справедливо, что мой атрибут не добавляется в объект пользователя.

Итак, я погуглил и понял, что что-то вроде этого может работать:

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

    return user;
});

И да! Это работает, но всегда есть НО.. *НО.. После этого он больше не сохраняет профиль под объектом пользователя. Однако это заставляет его работать:

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

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

    return user;
});

Итак, что я хочу от вас, ребята?

  1. Я хочу знать, почему onCreateUser теряет профиль (до исправления выше) в моем случае?
  2. Является ли мой подход хорошей практикой?
  3. Есть ли лучшее решение, добавляющее дополнительные атрибуты для пользовательского объекта при их создании?

ps: Думаю понятно, почему я не хочу сохранять все лишние поля под профилем ;)


person lehtu    schedule 05.05.2015    source источник


Ответы (3)


Ну, это было не так уж сложно. Вот это стоит в документации: «Функция создания пользователя по умолчанию просто копирует options.profile в новый пользовательский документ. Вызов onCreateUser переопределяет хук по умолчанию». - Accounts.onCreateUser

person lehtu    schedule 05.05.2015
comment
Есть ли систематический способ вызова оригинальной реализации? как "супер" - person ApriOri; 25.05.2017

Попробуй это:

Accounts.onCreateUser((options, user) => (Object.assign({}, user, options)));
person Teng Zhang    schedule 02.08.2016
comment
Можете ли вы объяснить, почему это хорошее решение проблемы, а не просто предоставление кода? - person DVK; 02.08.2016

Лучшее, что я нашел для этой проблемы, это:

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

person Nats_Ayala    schedule 13.06.2017