quien - ¿Hay un gancho post createUser en meteorito al usar el paquete accounts-ui?
que son la lluvia de estrellas (7)
Digamos que tengo una aplicación de tareas pendientes, y quiero asegurarme de que cada usuario que se registre tenga al menos un todo para empezar, algo así como "¡Primero todo para tachar!", ¿Cómo lo haría en meteoro?
En general, en la forma en que lo veo, puedo hacerlo cuando el usuario se crea por primera vez (ideal), o verificar si necesitan un nuevo todo cada vez que inician sesión (menos ideal). En este último caso, puedo hacer un control para Todos.findOne()
, y si el recuento es 0, agregue uno. Sin embargo, parece que ya sea que haga esto en mi enrutador cuando se carga la página, o en la función .rendered
alguna plantilla, la colección que estoy revisando no se ha cargado aún, así que siempre creo un nuevo todo, incluso si uno realmente lo hace existe. Entonces sería genial si alguien pudiera explicar cómo solucionarlo.
Pero lo que idealmente quiero es la capacidad de crear un nuevo Todo cuando se crea el usuario. Hay un método Accounts.onCreateUser
, pero se usa para agregar información adicional al perfil del usuario, no un gancho de post-creación. También hay un método para crear mediante programación al usuario que utiliza Accounts.createNewUser
con una devolución de llamada, pero estoy usando el paquete accounts-ui, así que no estoy agregando usuarios mediante programación. En un caso menos ideal, podría verificar el Todo siempre que el usuario inicie sesión, pero incluso en ese caso, parece que hay un inicio de sesión federado Accounts.loginWithXService
, por lo que no estoy seguro de cómo manejar la devolución de llamada cuando cualquier usuario inicie sesión, independientemente del tipo de servicio.
Creo que me falta algo simple, así que me disculpo si esto es súper obvio. Cualquier ayuda es apreciada.
Si está utilizando el paquete postSignUpHook
: postSignUpHook
ahora existe.
Splendido acaba de fusionar mi solicitud de extracción para exactamente este problema.
AccountsTemplates.configure({
/*...*/
postSignUpHook: /*[callback with your actions post full user creation goes here]*/,
/*...*/
}
Documentation (Necesitarás desplazarte hacia abajo es el último gancho):
func (userId, info) Invocado, solo del lado del servidor, justo después de la creación exitosa de una cuenta de usuario, se envía el pwdForm para el registro: permite realizar acciones personalizadas sobre los datos que se envían después de que estamos seguros de que se creó un nuevo usuario. Un uso común podría ser la aplicación de roles al usuario, ya que esto solo es posible después de completar por completo la creación del usuario en alanning: roles. El ID de usuario está disponible como el primer parámetro, de modo que se puede recuperar el objeto del usuario. La contraseña no está disponible porque ya está encriptada, aunque la contraseña encriptada se puede encontrar en la información si se usa.
Creo que esto responde mejor a esta pregunta: ¿cómo puedo crear usuarios del lado del servidor en Meteor?
en resumen:
Accounts.createUser({
username: username,
email : email,
password : password,
profile : {
//publicly visible fields like firstname goes here
}
});
revisa los documentos meteorológicos para obtener más información: docs.meteor.com/#/full/accounts_createuser
La Meteor API ahora tiene el gancho onCreateUser
:
Accounts.onCreateUser(function (options, user) {
Todos.insert({
owner: user._id,
text: "First todo to cross off!",
});
// We still want the default hook''s ''profile'' behavior.
if (options.profile)
user.profile = options.profile;
return user;
});
Puede utilizar las funciones que Meteor llama para envolverlas. También estoy usando los paquetes accounts-ui y accounts-password y uso el método _.wrap de Underscore para redefinir la función loginWithPassword. Subrayado está incluido en Meteor por defecto.
Utilizo algo así para iniciar sesión:
Meteor.loginWithPassword = _.wrap(Meteor.loginWithPassword, function(login) {
// Store the original arguments
var args = _.toArray(arguments).slice(1),
user = args[0],
pass = args[1],
origCallback = args[2];
// Create a new callback function
// Could also be defined elsewhere outside of this wrapped function
var newCallback = function() { console.info(''logged in''); }
// Now call the original login function with
// the original user, pass plus the new callback
login(user, pass, newCallback);
});
En este caso específico, el código anterior irá en su código de cliente en alguna parte.
Para Accounts.createUser, podría verse algo así (también en algún lugar del código del cliente):
Accounts.createUser = _.wrap(Accounts.createUser, function(createUser) {
// Store the original arguments
var args = _.toArray(arguments).slice(1),
user = args[0],
origCallback = args[1];
// Create a new callback function
// Could also be defined elsewhere outside of this wrapped function
// This is called on the client
var newCallback = function(err) {
if (err) {
console.error(err);
} else {
console.info(''success'');
}
};
// Now call the original create user function with
// the original user object plus the new callback
createUser(user, newCallback);
});
Espero que sea útil.
Quería comentar la respuesta de David Braun con la confirmación de que funciona, pero no con la reputación suficiente, así que estoy votando y repitiéndola aquí: me pareció importante reafirmar, ya que parece ser la forma más "meteórica" :-) de dirigiéndose al OP.
Gracias a David Braun por publicar.
Solo un comentario adicional para otros principiantes: esto va en un bloque de ejecución del servidor o en un archivo en el directorio / server.
Accounts.onCreateUser(function (options, user) {
Todos.insert({
owner: user._id,
text: "First todo to cross off!",
});
// We still want the default hook''s ''profile'' behavior.
if (options.profile)
user.profile = options.profile;
return user;
});
Uno de los desarrolladores de Meteoros respondió esta pregunta en Meteor google group: https://groups.google.com/forum/?fromgroups=#!topic/meteor-talk/KSz7O-tt4w8
Básicamente, en este momento, no hay ningún gancho createUser cuando se usa accounts-ui, solo cuando se hace mediante programación a través de Accounts.createUser
. Además, no hay ganchos para iniciar sesión, a menos que use las funciones de inicio de sesión de nivel inferior como loginWithFacebook
, etc. Todavía no he encontrado una forma ideal de solucionar esto, pero hay algunas formas de manejarlo:
si necesita ingresar un valor predeterminado en una colección, en la suscripción de esa colección, use el argumento onComplete. En esta devolución de llamada, si no hay entradas en la colección, agregue una. Esto evita el primer problema que mencioné en mi publicación sobre no saber cuándo se cargó una colección, aunque no es ideal ya que la colección podría estar vacía porque el usuario ya eliminó la primera predeterminada:
Meteor.subscribe ''todos'', user: Meteor.userId(), () -> todo = Todos.findOne() unless todo Todos.insert user: Meteor.userId()
puede configurar un
Meteor.autorun
inicio de sesión utilizando el método reactivoMeteor.autorun
para comprobar si hay algún cambio en Meteor.userId (). Solo se llamará cuando el usuario inicie sesión / vuelva a cargar la página. Esto es más útil para cosas que no son de recolección, ya que no se garantiza que la colección se cargue cuando Meteor.userId esté configurado:Meteor.autorun () -> if Meteor.userId() console.log ''Do some post login hook''
Así que creo que la solución eficiente todavía está por ahí, pero quería actualizar esta publicación con soluciones que había encontrado mientras tanto.
Usé el método _.wrap descrito anteriormente, pero quería incluir una sugerencia adicional. Es una buena idea llamar a la devolución de llamada original desde su nueva devolución de llamada personalizada. Meteor hace algunas cosas sobre la devolución de llamada que no queremos perdernos.
Código modificado que funcionó como un campeón para mí:
Accounts.createUser = _.wrap(Accounts.createUser, function(createUser) {
// Store the original arguments
var args = _.toArray(arguments).slice(1),
user = args[0];
origCallback = args[1];
var newCallback = function(error) {
// do my stuff
origCallback.call(this, error);
};
createUser(user, newCallback);
});