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

[SOLUCIONADO] Nodejs se vuelve loco

Estas en el tema de Nodejs se vuelve loco en el foro de Node.js en Foros del Web. A ver si alguien tiene alguna idea de por que me esta pasando esto. Tengo una pagina web que se conecta a un servidor nodejs. ...
  #1 (permalink)  
Antiguo 24/04/2014, 05:15
 
Fecha de Ingreso: febrero-2014
Mensajes: 30
Antigüedad: 10 años, 10 meses
Puntos: 0
Nodejs se vuelve loco

A ver si alguien tiene alguna idea de por que me esta pasando esto.

Tengo una pagina web que se conecta a un servidor nodejs. El servidor nodejs esta conectado con una base de datos MongoDB.

En la pagina en cuestión tengo implementado un buscador (JavaScript) que va buscando por todas las tablas hasta encontrar una coincidencia y de lo contrario lanza un aviso de que el termino buscado no corresponde a nada de lo que hay en la BD.

Ahora viene la pregunta. Cuando hago la primera búsqueda en la pagina, me responde bien sea lo que sea (tanto si existe la búsqueda como si no), pero si vuelvo a hacer otra búsqueda la pagina se bloquea haciendo una infinidad de peticiones al servidor con lo que acaba por bloquearse todo.

Las peticiones al servidor son del tipo a esta:

Código Javascript:
Ver original
  1. function persona(termino) {
  2.  
  3.       console.log("dentro de persona")
  4.  
  5.       consultar_persona(termino, function (persona) {
  6.  
  7.           if (persona.length == 0) {
  8.               console.log("No es una persona.");
  9.               genero(termino);
  10.  
  11.           } else {
  12.  
  13.               consultar_id_autor(persona[0].idPersona, function (autor) {
  14.  
  15.                   console.log(autor.length);
  16.  
  17.                   for (var i = 0; i <= autor.length - 1; i++) {
  18.  
  19.                       console.log("Autor: " + autor[i].titulo);
  20.                   } //for
  21.  
  22.               });
  23.  
  24.               consultar_id_realizador(persona[0].idPersona, function (realizador) {
  25.  
  26.                   console.log(realizador.length);
  27.  
  28.                   for (var i = 0; i <= realizador.length - 1; i++) {
  29.  
  30.                       console.log("Realizador: " + realizador[i].titulo);
  31.                   } //for
  32.  
  33.  
  34.  
  35.               });
  36.           } //else      
  37.       }); //consultar_persona
  38.  
  39.   } //persona

¿Alguna Sugerencia?

Gracias de Antemano.
  #2 (permalink)  
Antiguo 25/04/2014, 01:45
 
Fecha de Ingreso: febrero-2014
Mensajes: 30
Antigüedad: 10 años, 10 meses
Puntos: 0
Busqueda Respuesta: Nodejs se vuelve loco

Ya está solucionada una parte del problema, resulta que había cometido un error en la programación y por eso se volvía loco el servidor.

Ahora el problema es que cuando realizo una búsqueda, la primera me la hace bien, pero la segunda vez que hago una búsqueda me devuelve dos veces el resultado, la tercera tres, la cuarta cuatro.....

En el servidor cada vez que hago una petición solo aparece una respuesta por su parte, por lo que sospecho que el problema está en el navegador, pero no se cual puede ser.

¿Alguna sugerencia?


Saludos
  #3 (permalink)  
Antiguo 25/04/2014, 11:28
Avatar de vick90  
Fecha de Ingreso: abril-2010
Mensajes: 144
Antigüedad: 14 años, 8 meses
Puntos: 14
Respuesta: Nodejs se vuelve loco

El problema tiene que estar dond recibes los datos la variable que recibes tienes que limpiarlo y luego asignarle el resultado que devuelve el resultado. igual si pones tu codigo es mas facil de ayudarte.
  #4 (permalink)  
Antiguo 26/04/2014, 01:55
 
Fecha de Ingreso: febrero-2014
Mensajes: 30
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Nodejs se vuelve loco

Ok, este es mi proxy:

Código Javascript:
Ver original
  1. function consultar_titulo(titulo_consulta, callback) {
  2.  
  3.     var socket = io.connect('http://localhost:8080');
  4.  
  5.        socket.emit('consultar_titulo', {
  6.         "titulo_consulta": titulo_consulta
  7.     });
  8.  
  9.     socket.on('respuesta_consultar_titulo', function (data) {
  10.  
  11.         callback(data.respuesta_emit);
  12.  
  13.     });


Este es mi servidor:

Código Javascript:
Ver original
  1. var app = require('http').createServer(handler);
  2. var io = require('socket.io').listen(app);
  3.  
  4. var consultas_bd = require('../logica_negocio/consultas_bd');
  5.  
  6.  
  7. app.listen(8080);
  8.  
  9. function handler (req, res) {
  10.     console.log (" peticion recibida en servidor web: " + req.url);
  11.     var nombre = req.url;
  12.     if (req.url == "/") {
  13.         nombre = "/index.html";
  14.     }
  15.     fs.readFile(__dirname + nombre, function (err, data) {
  16.         if (err) {
  17.             res.writeHead(500);
  18.             return res.end('error al cargar: ' + req.url);
  19.         }
  20. //  res.setHeader("Content-Type","img/jpeg"); //MIME TYPE      
  21.         res.writeHead(200);
  22.         res.end(data);
  23.     });
  24. }//handler
  25.  
  26.  
  27. io.sockets.on('connection', function (socket){
  28.  
  29.         socket.on('consultar_titulo', function(data){
  30.  
  31.             console.log("Servidor(): Conexion (consultar_persona) Recibida.");
  32.  
  33.             consultas_bd.consultar_titulo(data.titulo_consulta, function(respuesta){
  34.  
  35.             socket.emit('respuesta_consultar_titulo', {"respuesta_emit": respuesta});  
  36.  
  37.  
  38.             });//consultar_titulo
  39.  
  40.         });//socket.on
  41.  
  42.     });//io.socket.on


Esta es mi "logica del negocio":

Código Javascript:
Ver original
  1. exports.consultar_titulo = function(titulo_consulta, respuesta_titulo) {
  2.  
  3.     var elementos = new Array();
  4.  
  5.     MongoClient.connect('mongodb://localhost:27017/test', function(err, db) {
  6.  
  7.         if (err)
  8.             throw err;
  9.  
  10.         var query = {
  11.             "titulo" : titulo_consulta
  12.         }
  13.  
  14.         var coleccion = db.collection('videos');
  15.  
  16.         var cursor = coleccion.find(query);
  17.  
  18.         cursor.each(function(err, item) {
  19.             if (item != null) {
  20.  
  21.                 elementos.push(item);
  22.  
  23.             } else {
  24.                 db.close();
  25.                 respuesta_titulo(elementos);
  26.             }
  27.         });//cursor
  28.  
  29.     });//connect
  30.  
  31.  
  32. }// consultar_titulo

Lo unico que podria limpiar es la variable elementos, pero al ser local se supone que esta limpia cada vez que se entra en el metodo.

Saludos
  #5 (permalink)  
Antiguo 26/04/2014, 13:23
Avatar de vick90  
Fecha de Ingreso: abril-2010
Mensajes: 144
Antigüedad: 14 años, 8 meses
Puntos: 14
Respuesta: Nodejs se vuelve loco

Pero yo me referia del lado del cliente en esta caso el callback podrias mostrar esa funcion?, deberias de usar express te facilita muchas cosas
Saludos.
  #6 (permalink)  
Antiguo 27/04/2014, 02:05
 
Fecha de Ingreso: febrero-2014
Mensajes: 30
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Nodejs se vuelve loco

Aquí está el código e indudablemente también el problema:

Código Javascript:
Ver original
  1. function titulo(terminoTitulo) {
  2.  
  3.       console.log("function():Titulo");
  4.  
  5.       console.log("Fuera del callback: " + terminoTitulo);
  6.  
  7.       consultar_titulo(terminoTitulo, function (titulo) {
  8.  
  9.           console.log("termino: " + terminoTitulo);
  10.           console.log("Dentro del Callback");
  11.           console.log(titulo.length);
  12.  
  13.  
  14.       });

Cuando imprimo por pantalla
Código Javascript:
Ver original
  1. console.log("Fuera del callback: " + terminoTitulo);
, me aparece el termino que le he introducido, pero cuando entra dentro del callback, me aparecen en orden todos los terminos que le he ido introduciendo.
Es como si la variable terminoTitulo de dentro del callback almacenara todas las consultas. La verdad es que no se como puedo evitar este problema.

Saludos
  #7 (permalink)  
Antiguo 27/04/2014, 22:47
Avatar de utan  
Fecha de Ingreso: agosto-2012
Mensajes: 126
Antigüedad: 12 años, 4 meses
Puntos: 17
Respuesta: Nodejs se vuelve loco

Hola,

Código Javascript:
Ver original
  1. var elementos = new Array();

colócala dentro de del callback del

Código Javascript:
Ver original
  1. MongoClient.connect

Me parece a mi que esta es creada y mantenida en la primera llamada a la function..

Código Javascript:
Ver original
  1. consultas_bd.consultar_titulo()
__________________
Mis conocimientos son limitado, pero si te puedo ayudar lo are gustoso mi chat particular, visitalo gracias http://rendezvouschat.com
  #8 (permalink)  
Antiguo 29/04/2014, 03:21
 
Fecha de Ingreso: febrero-2014
Mensajes: 30
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Nodejs se vuelve loco

Gracias por tu respuesta utan.

El problema no está ahí ya que cada vez que se llama a esa función, la variable elementos se crea nueva con lo que esta vacía (comprobado).
  #9 (permalink)  
Antiguo 29/04/2014, 08:22
Avatar de utan  
Fecha de Ingreso: agosto-2012
Mensajes: 126
Antigüedad: 12 años, 4 meses
Puntos: 17
Respuesta: Nodejs se vuelve loco

Cual es el problema en si entonces?

Entendí que después de la primera llamada de tu cliente a servidor , este responde con todas las consultas que insistes con anterioridad.

Podrías replantear el problema nuevamente , no con el antiguo pero con el actual?

gracias.
__________________
Mis conocimientos son limitado, pero si te puedo ayudar lo are gustoso mi chat particular, visitalo gracias http://rendezvouschat.com
  #10 (permalink)  
Antiguo 29/04/2014, 09:14
 
Fecha de Ingreso: febrero-2014
Mensajes: 30
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Nodejs se vuelve loco

Hola Utan.

Ya resolví el problema utilizando promesas. El problema era que cuando hacia la llamada a la function titulo(), esta se ejecutaba una vez, pero el callback de consultar_titulo se ejecutaba tantas veces como veces lo hubiera invocado.

Si por ejemplo llamaba una vez a la funcion titulo(), pasandole "aaa", todo funcionaba correctamente. El problema estaba que cuando hacia una nueva consulta, por ejemplo "bbb", en el momento de entrar en el callback, este se ejecutaba primero con "aaa", y despues con "bbb". Para entenderlo mejor dejo el log de la consola:

Código Javascript:
Ver original
  1. titulo():
  2. titulo(): function(): Titulo
  3. titulo(): Fuera del callback: bbb  
  4. titulo(): termino: aaa
  5. titulo(): Dentro del Callback
  6. titulo(): 0
  7. titulo(): termino: bbb
  8. titulo(): Dentro del Callback
  9. titulo(): 0

Ahora el problema se revuelve usando promesas y la libreria Q, con lo que el codigo de llamada quedaria como:

Código Javascript:
Ver original
  1. function titulo(terminoTitulo) {
  2.  
  3.     var promesa = function (arg1) {
  4.  
  5.         var defer = Q.defer();
  6.         consultar_titulo(arg1, defer.resolve);
  7.         return defer.promise;
  8.  
  9.     } //promesa
  10.  
  11.     promesa(terminoTitulo).then(function (resultado) {
  12.  
  13.         console.log("Dentro de Q");
  14.         console.log(resultado[0].titulo);
  15.  
  16.     });

Perdón si me he explicado mal y he causado confusión.

Saludos

Etiquetas: javascript, mongodb
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 04:24.