entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

numero de resultados mysql nodejs

quiero tener la logintud de resultados de una consulta para mostrar al cliente cuantos comentarios fueron escritos en dicho ID estoy utilizando express y ejs

en mi cliente esta

<% numComment(1); %>

mi server

var ClientSQL = new SQL('localhost', 'root', '', 'db');

app.locals.numComment = function(id) {
    connection.query("SELECT * FROM app_mensajes WHERE ID_post = "+ id, function(err, result1) {
        return result1.length;
    });
}

el problema esta en que no retorna el valor del resultado pero cuando hago el debug dentro de la funcion con console.log(result1.length); muestra el resultado.

1 Respuesta

3votos

white Puntos75880

Hola @jsstoni, no tengo mucho conocimiento sobre edge.js pero el tema es el clasico problema de closures y eventos, no vas a obtener nunca la cantidad de filas por que la query se hace asincronicamente. la funcion numComment no regresa nada, el callback de la query es el que regresa el total de filas.

creo que deberías obtener de otra forma el identificador, como por ejemplo usar callbacks.

id = 1; // obtener el id de otra forma.
connection.query("select * from app_mensajes where ID_post="+id, function(err, result1) {
    // aca enviamos los valores a la vista
    // ejemplo res.render('vista', {'total' : result1.length});
});

saludos!

0voto

Leonardo-Tadei comentado

Totalmente de acuerdo...

Entre la asincronía y el manejo de ámbito de las variables de JS, a veces cosas triviales se vuelven un infierno (al menos para mi)

0voto

jsstoni comentado

de que otro modo podría obtener el id para renderizar el resultado en el cliente :/

0voto

white comentado

no tengo idea de como manejas las vistas, pero obteniendo el id como parametro de la url seria una forma.

router.get('/:id', function(req, res, next) {

    var id = req.params.id;

connection.query("SELECT * FROM app_mensajes
               WHERE ID_post = " + id, function(err, result1)
    {
        res.render('index', {total: result1.length});
    });
});

en tu vista obtendrías la variable total, en jade por ejemplo: span #{total}

EDIT: acabo de ver que el motor de plantillas que usas es ejs, nada que ver con edge no se por que vi eso :P

en ejs sería <% total %>

0voto

jsstoni comentado

@white esta bien para un solo resultado en mi caso seria muchos resultados.

0voto

white comentado

Vas a tener que especificarme como obtienes los o el identificador para la function numComment(id), estan en un bucle? agrega el codigo que tienes.

0voto

jsstoni comentado

server

app.get('/', function(req, res) {
    connection.query("SELECT * FROM app_post", function(err, data) {
        res.render('index', { post : data });
    });
});

index

<% for(var i = 0; i < post.length; i++) { %>
<div>
<strong><%= post[i]['name']; %></strong>
<p><%= post[i]['tema']; %></p>
<div>comentarios: <%= numComment(post[i]['ID']); %></div>
</div>
<% } %>

0voto

white comentado

Tienes varias soluciones, una de ellas es obtener la cantidad de resultados en la misma consulta sin necesidad de hacer subconsultas en un bucle.

la query en cuestion:

SELECT *, count(m.ID_post) as total
FROM app_post AS p
LEFT JOIN app_mensajes as m ON m.ID_post = p.ID
GROUP BY p.ID

servidor:

app.get('/', function(req, res) {
    connection.query(
        "SELECT *, count(m.ID_post) as total
         FROM app_post AS p
         LEFT JOIN app_mensajes as m ON m.ID_post = p.ID
         GROUP BY p.ID",
        function(err, data)
        {
            res.render('index', { post : data });
        }
    );
});

cliente:

<% for(var i = 0; i < post.length; i++) { %>
<div>
<strong><%= post[i]['name']; %></strong>
<p><%= post[i]['tema']; %></p>
<div>comentarios: <%= post[i]['total']; %></div>
</div>
<% } %>

una mejor solucion podria ser que agreges una columna a tu tabla app_post llamada "total_mensajes" que contendra la cantidad de mensajes, que podran ser actualizados en una consulta cuando agreges un mensaje nuevo.

0voto

jsstoni comentado

estaba tan cerrado en solucionarlo que jamas pense que atraves de la consulta se podria solucionar, muchas gracias amigo...

0voto

jsstoni comentado

estaba tan cerrado en solucionarlo que jamas pense que atraves de la consulta se podria solucionar, muchas gracias amigo...

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta