Node es mas rápido que las consultas a MySQL

136 views
Skip to first unread message

Luis Enrique Muñoz

unread,
Apr 3, 2014, 8:06:22 PM4/3/14
to node...@googlegroups.com
Estimados compañeros, ojala puedan darme una mano con mi problemita. Voy a plantear un código:
coneccion.query('SELECT * FROM tabla', function(error, resultado, fila){
if(resultado.length>0){
resultado.forEach(function(obj){
coneccion.query('SELECT * FROM otra_tabla WHERE id="'+ obj.id +'"', function(error, otroResultado, fila){
// codigo importante que debo recoger
objeto = {
"id": otroResultado[0].id,
"otra_cosa": otroResultado[0].otra_cosa,
}
});
}
socket.emit("envia", {"objeto": objeto});
}
})

Pues obtengo un error, ya que, "socket.emit" se envía antes que el bucle haya terminado.. es decir, este codigo no respeta el foreach...  alguien tiene alguna idea de como podría hacerlo mejor???

Saludos

Luis Enrique Muñoz

unread,
Apr 3, 2014, 8:08:19 PM4/3/14
to node...@googlegroups.com
PD. Al margen del obvio error de que el objeto siempre está reemplazando su contenido (si fuera un array que en cada indice guarde un objeto sería mejor). El tema es que no respeta el foreach, lo envía sin haberlo terminado de iterar.

Antonio Ríos

unread,
Apr 3, 2014, 8:31:20 PM4/3/14
to node...@googlegroups.com
tendría que ver el contexto de las consultas que estás haciendo (de lado del cliente que haces con los datos), podrías utilizar un inner join y así optimizar la obtención de datos, tengo uno ejemplo en estos videos https://www.youtube.com/watch?v=7639sguMMGU, espero te sirva, sino puedes explicar exactamente que necesitas...

Antonio


--
Has recibido este mensaje porque estás suscrito al grupo "NodeJS ES" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nodejs-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Luis Enrique Muñoz

unread,
Apr 3, 2014, 11:14:44 PM4/3/14
to node...@googlegroups.com
Hola Antonio, gracias por tu respuesta.
Bueno, mi problema no tiene que ver con el uso de Node, socket.io o MySQL. En realidad, cómo combinarlos adecuadamente, ya que, tengo un bucle, y en cada iteracción hace una nueva consulta SQL (Que no la hace en realidad ya que se pasa directamente al socket.emit). Mi idea es saber a "cuantas personas les ha gustado un determinado POST" -- (un mini facebook, por llamarlo así) que estoy haciendo. Para ese efecto, hago una consulta donde:
1. Extraigo todos los post. (Primera consulta)
2. Dependiendo de los resultados, verifico -- registro por registro -- a cuantas personas les ha gustado o no la publicación (Esta en otra tabla -- segunda consulta).

El tema es que no hace la segunda consulta, ya que mientras que la está haciendo, Node "salta" al socket.emit.

Alguna idea?

David Roncancio

unread,
Apr 4, 2014, 10:17:36 AM4/4/14
to node...@googlegroups.com
Hola Luis

Node es non-blocking i/o esto quiere decir que tu codigo no va a bloquearse mientras haga cosas de i/o (consultas a la db por ejemplo), a pesar que Array.forEach sea syncrono (http://ecma262-5.com/ELS5_HTML.htm#Section_15.4.4.18), tus consultas a la base de datos no entonces, cada el codigo va a llamar a "coneccion.query(query, callback);" el pasa al siguiente y "encola" estas tareas, ejecutando el emit, mientras se hacen las consultas, te recomiendo usar algo como async(https://github.com/caolan/async) para hacer estas tareas de i/o syncronas

cordialmente,

David Roncancio
(+57) 3014311354

DiegoUG

unread,
Apr 4, 2014, 2:50:35 PM4/4/14
to nodejs-es
No se si esto te ayude, en cada consulta para poder continuar necesita el callback de la respuesta, este es un ejemplo que tengo, no esta terminado pero mira si te sirve:


podrías usar librerías externas para detener el flujo mientas esta la respuesta, mira:


y también te recomiendo mirar los chanels, para delegar las tareas a otras partes del código, y de esta forma no bloquearías al servidor http:

  Diego Alonso Uribe Gamez

Desarrollador web

Twitter: @DiegoUG

Google+: +DiegoAlonsoUribeGamez



Luis Enrique Muñoz

unread,
Apr 4, 2014, 2:57:19 PM4/4/14
to node...@googlegroups.com
Muchas gracias por sus respuestas, en realidad ya solucioné el problema (es que era muy urgente) pero usando consultas anidadas, hice una mega consulta, pero funcionó bastante bien.

Tomaré en cuenta la información que ustedes muy gentilmente me proporcionaron. Les envío un fuerte abrazo a la distancia a todos.
Reply all
Reply to author
Forward
0 new messages