started - meteor user methods
Agregar más campos a las cuentas de usuario de Meteor (6)
Estoy usando mrt add accounts-ui-bootstrap-dropdown
y mrt add accounts-password
para obtener una página de inicio de sesión simple ejecutándose en mi aplicación.
Los usuarios de cuentas me dan un buen hash que contiene identificadores, createdAt, correos electrónicos, etc.
Si quisiera agregar otros campos en este hash para poder utilizarlos más adelante, ¿cómo podría hacerlo? Por ejemplo, quiero ingresar también su nombre de pila y apellido:
"given_name": "John", "apellido": "Doe"
De la documentación ( https://github.com/ianmartorell/meteor-accounts-ui-bootstrap-3/blob/master/README.md ):
Opciones de registro personalizado
Puede definir campos de entrada adicionales para que aparezcan en el formulario de suscripción, y puede decidir si desea guardar estos valores en el objeto de perfil del documento de usuario o no. Especifique una matriz de campos usando Accounts.ui.config como sigue:
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;
}
}
}]
});
La guía oficial Meteor proporciona una respuesta completa con un código de ejemplo:
La mejor forma de almacenar sus datos personalizados en la colección Meteor.users es agregar un nuevo campo de nivel superior con un nombre único en el documento del usuario.
La respuesta aceptada tiene el CÓMO correcto, pero el DONDE está desactualizada la información. (Sí, esto sería mejor como un comentario sobre la respuesta, pero aún no puedo hacerlo).
De la documentación de Meteor 1.2 :
La mejor forma de almacenar sus datos personalizados en la colección Meteor.users es agregar un nuevo campo de nivel superior con un nombre único en el documento del usuario.
Y con respecto al uso de Meteor.user.profile para almacenar información personalizada:
🔗No usar perfil
Existe un tentador campo existente llamado perfil que se agrega de forma predeterminada cuando un nuevo usuario se registra. Históricamente, este campo se diseñó para ser utilizado como un borrador para datos específicos del usuario, tal vez su imagen avatar, nombre, texto introductorio, etc. Debido a esto, el usuario puede escribir automáticamente el campo de perfil en cada usuario. También se publica automáticamente en el cliente para ese usuario en particular.
Básicamente, probablemente esté bien almacenar información básica como nombre, dirección, dob, etc. en el campo de perfil, pero no es una buena idea almacenar nada más que eso, ya que, de forma predeterminada, el cliente podrá escribirlo y ser vulnerable a usuarios malintencionados. .
Los usuarios son objetos especiales en meteoritos; no desea agregar campos en el usuario sino en el perfil de los usuarios.
Del doc:
By default the server publishes username, emails, and profile.
Si desea agregar propiedades como apellido al crear la cuenta, debe usar en el Account.onCreateUser
del lado del servidor 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
}
Si desea actualizar un usuario después, puede hacerlo desde el cliente de esa manera:
Meteor.users.update({_id:Meteor.user()._id}, { $set: {what you want to update} });
Por defecto, la base de usuarios permitirá eso (el usuario actual puede actualizarse). Si no confías en tus usuarios y quieres asegurarte de que todo esté correctamente actualizado, también puedes prohibir cualquier actualización del cliente y hacerlos a través de Meteor.call()
y proceder a las comprobaciones del servidor. Pero esto sería triste.
Editar:
Como se dijo en los comentarios, agregar opciones a través de la cuenta-ui estándar no será posible. Solo podrá actualizar al usuario después del registro. Para agregar opciones cuando se suscribe, tendrá que hacer su propia forma.
No lo insultaré escribiendo el marcado HTML, pero esto es lo que desea tener después del evento de envío (y después de las diversas comprobaciones):
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 );
});
Solo necesita el paquete de cuenta base; no la cuenta-ui.
Iniciar sesión con las redes sociales es pastel:
Meteor.loginWithFacebook({
requestPermissions: [''email'', ''user_birthday'', ''user_location'']
}, function(error){loginCallBack(error);});
Acerca de la respuesta que hizo ram1:
Esta no es la forma en que funciona el meteorito. No "publica" un formulario. Desea que toda la comunicación entre el cliente y el servidor se realice a través del websocket. El equivalente de lo que está hablando es hacer un "Meteor.call (''miserverfunction'', myarguments, mycallback)" de un método de servidor del cliente y pasar los argumentos que quiere que use el servidor.
Pero esta no es la forma en que obtendrás lo mejor del meteoro. Existe la filosofía con la que quieres trabajar:
- tienes datos en tu mini mongo local que obtienes del servidor
- actualiza localmente esos datos en su base / vista
- meteoro hace su magia para transmitir esas actualizaciones al servidor
- allí el servidor puede responder: ok, las actualizaciones guardadas, esto es perfecto para usted. O responde: ¡nop! revertir los cambios (y puede implementar un sistema de notificación de errores)
(puede responder no porque no tiene permiso para actualizar este campo, porque esta actualización rompe una regla que usted configuró ...)
Todo lo que hace es establecer permisos y controles en las bases de datos del servidor. De esa manera, cuando un cliente honesto hace una actualización, ve el resultado instantáneamente; mucho antes de que se haya enviado al servidor y enviado a los otros clientes. Esta es la compensación de latencia , uno de los siete principios del meteoro.
Si modifica una información a través de Meteor.call, lo hará:
- enviar una actualización al servidor
- el servidor verifica y actualiza la base
- el servidor envía la actualización a los clientes (incluyéndolo a usted)
- sus actualizaciones base locales y su actualización de vista => ve su actualización
=> esto es lo que tuviste en la aplicación de ayer; meteoro te permite construir una aplicación de hoy. No aplique las viejas recetas :)
Terminé usando https://atmospherejs.com/joshowens/accounts-entry que ofrece una opción de config
extraSignUpFields
.
Tuve el mismo problema y logré hacerlo solo con Accounts.createUser
:
Accounts.createUser({
email: email,
password: password,
profile: {
givenName: ''John'',
surname: ''Doe'',
gender: ''M''
}
}
Esa es una forma muy simple y funciona. Simplemente agregue sus variables deseadas en la sección de perfil y debería estar listo. Espero que ayude a alguien.