Foros del Web » Programando para Internet » Node.js »

[SOLUCIONADO] callback de insert a mysql nunca se ejecuta

Estas en el tema de callback de insert a mysql nunca se ejecuta en el foro de Node.js en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 17/04/2013, 02:31
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 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
  #2 (permalink)  
Antiguo 29/04/2013, 04:20
Avatar de antoniopol  
Fecha de Ingreso: agosto-2012
Ubicación: Valladolid
Mensajes: 114
Antigüedad: 11 años, 8 meses
Puntos: 21
Respuesta: callback de insert a mysql nunca se ejecuta

Lo primero que haría es comentar todo el contenido y realizar un console.log por ejemplo mostrando "entra" porque creo que al callback debería entrar, lo que no se es si la función mail te puede dar problemas por el tema de ser asincrono y deberías meter el render "registre" dentro de la función, o pasarle por parametros a la función mail que render quieres hacer.

Si lo solucionas de otra manera comentalo así sigo aprendiendo ya que me estoy iniciando =).
__________________
>> Blog de desarrollo web.
>> @antoniopol06 amante de la Web =D
  #3 (permalink)  
Antiguo 02/05/2013, 02:37
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
Respuesta: callback de insert a mysql nunca se ejecuta

Buenas de nuevo, en primer lugar gracias antoniopol por tu tiempo.

Sobre lo de la función MAIL(), segui tu consejo y ahora paso el render como un parametro más en forma de función (se ejecuta como un callback, al terminar de ejecutarse el contenido de la función MAIL() ) así es mas practica dicha función y me aseguro de que el render no se haya ejecutado hasta el momento exacto de que todo termino.

[Dejo la función por si a alguien le parece útil]

Código Javascript:
Ver original
  1. exports.mail = function (target,from,subject,body,callback){
  2.     nodemailer = require("nodemailer")
  3.  
  4.     var smtpTransport = nodemailer.createTransport("SMTP",{
  5.         service: "Gmail", //uso el smtp de gmail para las pruebas
  6.         auth: {
  7.             user: "[email protected]",
  8.             pass: "pass"
  9.         }
  10.     });
  11.  
  12.     var mailOptions = {
  13.         from: from, // quien envía
  14.         to: target, // quienes reciben
  15.         subject: subject, // asunto del mensaje
  16.         html: body // cuerpo del mensaje (en html)
  17.     }
  18.  
  19.     smtpTransport.sendMail(mailOptions, function(error, response){
  20.         if(error){ console.log(error); }
  21.         else{ console.log("Message sent: " + response.message); }
  22.         smtpTransport.close(); // shut down the connection pool, no more messages
  23.     });
  24.  
  25.         if(typeof(callback)==="function"){ callback(); }
  26.  
  27.    
  28. }

Pero el problema que tengo no era eso. Es cuando realizo el insert, que debería lanzarse el callback pero no lo hace en ningun momento. Lo logico sería pensar que tengo algun problema en el insert de sql propiamente dicho, que hace que el callback no se ejecute, pero si realizo dicho insert sin callback, todo funciona correctamente (inserción, envio de mail, el render con el mensaje).

Lo de depurar con el console.log() fue lo primero que hice. Y aquellos que estan justo antes de empezar y justo despues de terminar el query, me aparecen en la consola, aquellos que estan dentro del callback no se ejecutan nunca.

Sin duda el problema está en la ejecución del callback tras el insert (la entrada en la base de dato, si que la hace, aunque nunca se ejecute el callback).... Seguire indagando y si doy con la tecla, lo compartire aquí para el bien común y de mientras, si a alguien se le ocurre alguna cosa más que probar, sigo estando abierto a sugerencias.

Un saludo a la comunidad!.

Última edición por kikeking1; 02/05/2013 a las 02:52
  #4 (permalink)  
Antiguo 03/05/2013, 01:40
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
De acuerdo Respuesta: callback de insert a mysql nunca se ejecuta

Ya encontre el fallo. Sín duda como indique al principio era algo bastante noob, pero bueno poco a poco se avanza.

Dejo aqui la resolución del problema para ahorrarle tiempo a aquellos que se encuentren alguna vez en la misma situación.

El fallo estaba en la forma de hacer el insert con las variables:
Código Javascript:
Ver original
  1. client.query("INSERT INTO `users` [.......]",[B] [variables],[/B]
  2.                         function(err,results){
  3.                             //code                          
  4.                         }  
  5.                     )//query (insert)

Si no paso las variables como parametro, si se realiza el callback, por lo que quedo una cosa así (variable con la cadena construida de sql pasada directamente al query) :
Código Javascript:
Ver original
  1. var sql = "INSERT INTO `users` (campo1,campo2,campo3) VALUES ( '"+req.body.campo1+"','"+req.body.campo2+"','"+req.body.campo3+"') ";
  2.                     client.query(sql,
  3.                         function(err,results){
  4.                             //code                          
  5.                         }  
  6.                     )//query (insert)

De todas maneras, aunque ya haya solventado el problema para seguir avanzando, me queda la duda ¿porque no se ejecutaba el callback? El patron original, esta sacado y comparado de bastantes ejemplos de por ahí y la mayorian usan estas estructura.. además de que quitando el tema de la ejecución del callback, no me producia ningún error en consola, y el insert en la base de dato se ejecutaban (los datos se guardaban).

Sí alguien que tenga más idea al respecto, pudiera ampliar esta duda, sería muy interesante para el resto. Sí en algún momento encuentro yo la respuesta, volveré para dejarla.

Un saludo comunidad.
  #5 (permalink)  
Antiguo 06/05/2013, 04:45
Avatar de antoniopol  
Fecha de Ingreso: agosto-2012
Ubicación: Valladolid
Mensajes: 114
Antigüedad: 11 años, 8 meses
Puntos: 21
Respuesta: callback de insert a mysql nunca se ejecuta

Me alegro que encontrases la solucion, al igual que tu yo también esoty empezando. Lo que se me ocurre es que el módulo que estes usando se haya actualizado y ya no funcione de la misma manera que hayas visto en los ejemplos.
__________________
>> Blog de desarrollo web.
>> @antoniopol06 amante de la Web =D

Etiquetas: callback, insert, mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:39.