Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/04/2013, 02:31
kikeking1
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 15 años, 6 meses
Puntos: 17
Exclamación callback de insert a mysql nunca se ejecuta

Hola a todos, a ver si podeis echar una mano a un iniciado de nodejs, pues seguramente sea un fallo de noob, pero no consigo visualizarlo.

el problema es el siguiente, hago una insercion de usuario en la base de datos despues de haber comprobado con un select, si el usuario existe.

Como en nodejs, las funciones se ejecutan asincronimamente hay que hacer uso de los callback para asegurarnos de que lo que dependa del resultado de la consulta mysql, exista cuando vayas a utilizar la información. Hasta aqui, todo genial, hago el select, se ejecuta el callback, hago asignación de variables etc y realizo el insert, el cual tambien funciona correctamente e inserta en la base de datos, la infomación como lo quiero.

Ahora la cuestión del problema, tras la inserción en la bbdd se envia un correo al usuario para que valide la cuenta (como podeis ver es un sistema de registro de usuarios clasico) y para ello, entre otro tengo que tener confirmado que el usuario se creo correctamente y ademas usar el identificador que se genero. Por lo que si o si, debe realizarse estas funciones en el callback del insert.

Veamos el codigo (he dejado lo esencial para centrarnos en el problema y evitar codigo superfluo de asignación de variables y tal)

Código Javascript:
Ver original
  1. client.query("SELECT id_user as id,validate FROM [.........]",
  2.         function selectCb(err, results, fields) {
  3.             if (err) { throw err;}
  4.             if(results[0]){
  5.                 if(results[0].id){
  6.                     var Vmail = (results[0].validate=='si')?true:false;
  7.                     res.render('registre', { msg : lang.gen67[1] });
  8.                 }
  9.             }
  10.             else{
  11.  
  12.                 if(req.body.password!='' && req.body.mail!='' && req.body.name!=''){
  13.  
  14.                     client.query("INSERT INTO `users` [.......]", [variables],
  15.                         function(err,results){
  16.                             var id_user = results.insertId ;
  17.                             MAIL('[email protected]','Title <[email protected]>','Subject','Cuerpo del mensaje');
  18.                             res.render('registre', { msg : lang.gen66[1] });
  19.                            
  20.                         }  
  21.                     )//query (insert)
  22.  
  23.  
  24.                 }//if validacion (existen las variables del formulario)
  25.                 else{
  26.                     res.render('registre', { msg : lang.gen68[1] });
  27.                 }
  28.             } //if validación (usuario no existe)
  29.  
  30.         }//function query (select)
  31.     );//query (select)

La configuración que estoy usando es nodejs + express + jade + node-mysql + nodemailer.

¿Alguna idea de porque no se ejecuta el callback del insert, cuando se ejecuta correctamente?

Con este codigo que os paso, me deja bloqueada la petición en el navegador (ya que el res.render() nunca se ejecuta).. si saco el render() fuera del callback. si termina la petición en el navegador.. pero obviamente falta información y no controlo en que momento se va a ejecutar.

Gracias, un saludo.

P.D.: La funcion MAIL() es una funcion a nivel global creada por mi, para el envio de correo. Esta y todo el resto codigo funciona correctamente, solo dejan de ejecutarse cuando lo introduzco en el callback del insert.

Última edición por kikeking1; 17/04/2013 a las 02:37