Подтвердить что ты не робот

Добавление дополнительных полей в учетные записи пользователей Meteor

Я использую mrt add accounts-ui-bootstrap-dropdown и mrt add accounts-password, чтобы получить простую страницу входа в мое приложение.

Пользователи учетных записей дают мне хороший хэш, содержащий идентификаторы, созданныеAt, электронные письма и т.д.

Если бы я хотел добавить другие поля в этот хеш, чтобы потом использовать их позже, как бы я это сделал? Например, я хочу также указать их имя и фамилию:

"given_name": "John", "surname": "Doe"

4b9b3361

Ответ 1

Пользователи - специальные объекты в метеор; вы не хотите добавлять поля в пользователя, но в профиль пользователя.

Из документа:

By default the server publishes username, emails, and profile.

Если вы хотите добавить такие свойства, как фамилия при создании учетной записи, вы должны использовать ее в Account.onCreateUser на стороне сервера: http://docs.meteor.com/#accounts_oncreateuser

Accounts.onCreateUser(function(options, user) {
    //pass the surname in the options

    user.profile['surname'] = options.surname

    return user
}

Если вы хотите обновить пользователя после этого, вы можете сделать это от клиента таким образом:

Meteor.users.update({_id:Meteor.user()._id}, { $set: {what you want to update} });

По умолчанию база пользователей позволит это (текущий пользователь может обновить себя). Если вы не доверяете своим пользователям и хотите, чтобы все было правильно обновлено, вы также можете запретить любые обновления от клиента и сделать их с помощью Meteor.call() и перейти к проверке на стороне сервера. Но это было бы грустно.


Изменить:

Как сказано в комментариях, добавление опций через стандартную учетную запись ui будет невозможно. После регистрации вы сможете обновить пользователя. Чтобы добавить параметры при подписке, вам нужно будет создать свою собственную форму.

Я не буду оскорблять вас, написав html-разметку, но вот что вы хотите иметь после события отправки (и после различной проверки):

var options = {
    username: $('input#username')[0].value,
    emails: [{
        address: $('input#email')[0].value,
        verified: false
    }],
    password: $('input#password')[0].value,
    profile: {
        surname: $('input#surname')
    },
};
Accounts.createUser( options , function(err){
    if( err ) $('div#errors').html( err.message );
});

Вам нужен только пакет учетной записи; а не аккаунт-ui.

Вход в социальные сети - это торт:

Meteor.loginWithFacebook({
    requestPermissions: ['email', 'user_birthday', 'user_location']
}, function(error){loginCallBack(error);});

Об ответе ram1, сделанном:

Это не способ работы метеора. У вас нет "POST" формы. Вы хотите, чтобы вся ваша связь клиент/сервер выполнялась через websocket. В качестве эквивалента того, о чем вы говорите, создается "Meteor.call(" myserverfunction ", myarguments, mycallback)" метода сервера от клиента ", и вы передаете аргументы, которые хотите использовать сервер.

Но это не так, как вы получите лучшее от метеор. Существует философия, с которой вы хотите работать:

  • У вас есть данные в вашем локальном мини-манго, который вы получили с сервера.
  • вы локально обновляете эти данные в своей базе/представлении
  • Метеор делает свою магию для передачи этих обновлений на сервер
  • там сервер может ответить: ok, обновления сохранены, это не без проблем. Или ответ: nop! отмените изменения (и вы можете внедрить систему уведомлений об ошибках).

(он не может ответить "нет", потому что у вас нет разрешения на обновление этого поля, потому что это обновление нарушает правило, которое вы установили...)

Все, что вы делаете, это настройка разрешений и элементов управления на стороне сервера баз данных. Таким образом, когда честный клиент делает обновление, он мгновенно видит результат; прежде чем он будет перенаправлен на сервер и отправлен другим клиентам. Это компенсация задержек, один из семи принципов метеор.

Если вы измените данные через Meteor.call, вы сделаете это:

  • отправить обновление на сервер
  • сервер проверяет и обновляет базу
  • сервер отправляет обновление клиентам (включая вас)
  • обновления вашей локальной базы и обновление вашего просмотра = > вы видите свое обновление

= > это то, что у вас было в вчерашнем приложении; Метеор позволит вам создать сегодняшнее приложение. Не применяйте старые рецепты:)

Ответ 2

Принятый ответ имеет право HOW, но WHERE - устаревшая информация. (Да, это было бы лучше как комментарий к ответу, но я не могу этого сделать.)

Из Документация Meteor 1.2:

Лучшим способом хранения ваших пользовательских данных в коллекции Meteor.users является добавление нового нового поля верхнего уровня в пользовательский документ.

И относительно использования Meteor.user.profile для хранения пользовательской информации:

🔗 Не используйте профиль

Theres заманчивое существующее поле, называемое профилем, которое добавляется по умолчанию, когда регистрируется новый пользователь. Это поле исторически предназначенный для использования в качестве царапины для пользовательских данных - возможно их образ изображения, имя, вводный текст и т.д. Из-за этого поле профиля для каждого пользователя автоматически записывается этим пользователем от клиента. Он также автоматически публикуется клиенту для этого конкретного пользователя.

В принципе, возможно, хорошо хранить основную информацию, такую ​​как имя, адрес, dob и т.д. в поле профиля, но не рекомендуется хранить что-либо помимо этого, как это будет, по умолчанию, быть доступным для записи клиентом и уязвимым для злоумышленников.

Ответ 3

У меня была такая же проблема, и мне удалось это сделать только с Accounts.createUser:

Accounts.createUser({
    email: email,
    password: password,
    profile: {
            givenName: 'John',
            surname: 'Doe',
            gender: 'M'
        }
}

Это очень простой способ, и он работает. Просто добавьте нужные параметры в раздел профиля, и он должен быть готов. Надеюсь, это поможет кому-то.

Ответ 5

Из документации (https://github.com/ianmartorell/meteor-accounts-ui-bootstrap-3/blob/master/README.md):

Пользовательские параметры регистрации

Вы можете определить дополнительные поля ввода, которые будут отображаться в форме регистрации, и вы можете решить, сохранить эти значения в объекте профиля пользовательского документа или нет. Укажите массив полей, используя Accounts.ui.config следующим образом:

Accounts.ui.config({
    requestPermissions: {},
    extraSignupFields: [{
        fieldName: 'first-name',
        fieldLabel: 'First name',
        inputType: 'text',
        visible: true,
        validate: function(value, errorFunction) {
          if (!value) {
            errorFunction("Please write your first name");
            return false;
          } else {
            return true;
          }
        }
    }, {
        fieldName: 'last-name',
        fieldLabel: 'Last name',
        inputType: 'text',
        visible: true,
    }, {
        fieldName: 'gender',
        showFieldLabel: false,      // If true, fieldLabel will be shown before radio group
        fieldLabel: 'Gender',
        inputType: 'radio',
        radioLayout: 'vertical',    // It can be 'inline' or 'vertical'
        data: [{                    // Array of radio options, all properties are required
            id: 1,                  // id suffix of the radio element
            label: 'Male',          // label for the radio element
            value: 'm'              // value of the radio element, this will be saved.
          }, {
            id: 2,
            label: 'Female',
            value: 'f',
            checked: 'checked'
        }],
        visible: true
    }, {
        fieldName: 'country',
        fieldLabel: 'Country',
        inputType: 'select',
        showFieldLabel: true,
        empty: 'Please select your country of residence',
        data: [{
            id: 1,
            label: 'United States',
            value: 'us'
          }, {
            id: 2,
            label: 'Spain',
            value: 'es',
        }],
        visible: true
    }, {
        fieldName: 'terms',
        fieldLabel: 'I accept the terms and conditions',
        inputType: 'checkbox',
        visible: true,
        saveToProfile: false,
        validate: function(value, errorFunction) {
            if (value) {
                return true;
            } else {
                errorFunction('You must accept the terms and conditions.');
                return false;
            }
        }
    }]
});

Ответ 6

Официальное руководство Meteor предоставляет исчерпывающий ответ с примером кода:

Лучшим способом хранения ваших пользовательских данных в коллекции Meteor.users является добавление нового нового поля верхнего уровня в пользовательский документ.

https://guide.meteor.com/accounts.html#custom-user-data