2
respostas

Duas buscas no mesmo middleware, na mesma rota.

Boa tarde pessoal, estou tentando fazer duas consultas ao banco de dados na mesma chamada de rota mas não estou conseguindo se puderem dar uma luz...

    app.get('/vagas', function(req, resp){

        const vagaDao = new VagaDao(db);
        vagaDao.lista().then(vagas => resp.marko(
                require('../views/vagas/lista/lista.marko'),
                {
                    vagas: vagas
                })
        ).catch(erro => console.log(erro));

        vagaDao.valoresPorPeriodo().then(periodos => resp.marko(
            require('../views/vagas/lista/lista.marko'),
            {
                periodos: periodos
            })
        ).catch(erro => console.log(erro));
    });

*** A função "valoresPorPeriodo" tem o seguinte código

valoresPorPeriodo(){
        return new Promise((resolve, reject) => {
            this._db.all(
                `
                SELECT 
                strftime('%Y-%m', periodo_cobranca) as periodo, 
                printf("%.2f", SUM(value)) as total_valor, 
                printf("%.2f", SUM(lost_value)) as total_valor_perdido 
                FROM vagas GROUP BY strftime('%Y-%m', periodo_cobranca)
                `
                ,
                (erro,resultados) => {
                   if (erro) return reject('Não foi possível calcular valores por periodo');

                   return resolve(resultados);
                }
            )
        });

Quando eu altero a ordem da chamada dos métodos no middleware consigo visualizar com sucesso o retorno do sql acima, porém, imagino que devido a eu atribuir ao "resp.marko..." na primeira chamada a segunda dá pau.

Se puderem me enviar algum conteúdo similar ou dar um norte, ficarei grato.

2 respostas

Boa tarde, Enrique! Como vai?

Eu já entendi o que está causando o problema. Mas antes de sugerir uma solução eu gostaria de entender melhor a situação pra que eu possa dar a vc o melhor caminho possível!

O que vc quer fazer exatamente quando acessar a rota /vagas? Essas duas consultas são necessárias pra toda e qualquer requisição pra /vagas? Com as respostas dessas perguntas eu poderei te ajudar de forma mais efetiva!

Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Boa tarde professor, vou muito bem

O que eu quero fazer é colocar uma pequena tabela de valores por período na mesma página que eu mostro as vagas ("/vagas"), como se fosse uma pequena informação (quase que um resumo dos valores), das vagas apresentadas, minha chamada por html ficaria assim:

            <h1> Dados qualitativos e quantitativos </h1>
            <h3> Valores por periodo </h3>
                <table id="valores" class="table table-striped table-hover">
                    <thead class="thead-dark">
                        <tr>
                            <td>Periodo</td>
                            <td>Valor</td>
                            <td>Valor Perdido</td>
                        </tr>
                    </thead>
                        <tr id="periodo_${periodo.periodo}"  for (periodo in data.periodos)>
                            <td>${periodo.periodo}</td>
                            <td>R$ ${periodo.total_valor}</td>
                            <td>R$ ${periodo.total_valor_perdido}</td>
                        </tr>
                </table>
               <table id="vagas"  class="table table-striped table-hover">
                    <thead class="thead-dark">
                        <tr>
                            <td>ID</td>
                            <td>Nome da Vaga</td>
                            <td>Nome do Cliente</td>
                            <td>Nome do candidato</td>
                            <td>Tipo do evento</td>
                            <td>Data e hora do evento</td>
                            <td>Valor cobrado</td>
                            <td>Quem gerou a cobrança</td>
                            <td>Ano/Periodo da cobrança</td>
                            <td>Valor Perdido</td>
                            <td>Motivo da Perda</td>
                        </tr>
                    </thead>
                            <tr id="vaga_${vaga.id}"  for (vaga in data.vagas)>
                            <td>${vaga.id}</td>
                            <td>${vaga.job_type}</td>
                            <td>${vaga.client_id}</td>
                            <td>${vaga.candidate}</td>
                            <% if (vaga.eventtype == "CANDIDATE_SENT") %>
                            <% { %>
                                <td>Candidato enviado</td>
                            <% } else { %>
                                <td>Candidato contratado</td>
                            <% } %>
                            <td>${vaga.dt_event}</td>
                            <td>${vaga.value}</td>
                            <td>${vaga.billed_by}</td>
                            <td>${vaga.periodo_cobranca}</td>
                            <td>${vaga.lost_value}</td>
                            <td>${vaga.refund_reason}</td>
                            <td><a href="/vagas/form/${vaga.id}">Editar</a></td>
                            <td><a href="#" data-ref="${vaga.id}" data-type="remocao">Remover</a></td>
                        </tr>
   </table> 

Omiti partes desnecessárias para entendimento e faltam algumas tratativas visuais, mas esses não são problemas.

Espero ter esclarecido melhor minha intenção.

*As vagas são dados brutos, tem 400 registros, a ideia dos valores por período é resumir um campo da tabela vagas. na mesma rota.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software