Добавление дополнительных полей в учетные записи пользователей Meteor
Я использую mrt add accounts-ui-bootstrap-dropdown
и mrt add accounts-password
, чтобы получить простую страницу входа в мое приложение.
Пользователи учетных записей дают мне хороший хэш, содержащий идентификаторы, созданныеAt, электронные письма и т.д.
Если бы я хотел добавить другие поля в этот хеш, чтобы потом использовать их позже, как бы я это сделал? Например, я хочу также указать их имя и фамилию:
"given_name": "John", "surname": "Doe"
Ответы
Ответ 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'
}
}
Это очень простой способ, и он работает. Просто добавьте нужные параметры в раздел профиля, и он должен быть готов. Надеюсь, это поможет кому-то.
Ответ 4
В итоге я использовал https://atmospherejs.com/joshowens/accounts-entry, который предлагает параметр extraSignUpFields
config
.
Ответ 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