Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Passar dois parâmetros pelo render

Estou tentando passar o resultado de duas pesquisa pelo render para o ejs, uma variável lista as cidades e outra as UFs para usar no combobox, mas não estou conseguindo, alguém poderia ajudar?

var listaUfes = function(req,res){
        var connection = app.infra.connectionFactory();
        var ufesDAO = new app.infra.UfesDAO(connection);

        return ufesDAO.lista(function(err, results) {
            console.log(results);
            return res.json(results);        
        });

        connection.end();        
    }   

    var listaCidades = function(req, res) {
        var connection = app.infra.connectionFactory();
        var cidadesDAO = new app.infra.CidadesDAO(connection);            

        return cidadesDAO.lista(function(err, results) { 
           console.log(results);
           return res.json(results);                    
        });        

        connection.end();
    }

    app.get('/cidades', function(req,res) {
        res.format({
            html: function() {
                res.render('cidades/frmcidadelista', {lista:listaCidades, siglas:listaUfes});
            },
            json: function() {
                res.json(results);
            }
        });
    });
5 respostas

Oi Rodrigo,

Quando vc faz res.render('cidades/frmcidadelista', {lista:listaCidades, siglas:listaUfes}); você está mandando para o ejs duas propriedades lista e siglas que vieram de duas variáveis listaCidades e listaUfes. O problema está nessas duas variáveis.

No código, as duas variáveis estão sendo criadas assim:

var listaUfes = function(req,res){
    código da função aqui
}

var listaCidades = function(req, res) {
   código da função aqui
}

Desse jeito, o valor das duas variáveis é uma function e não os resultados que vieram do banco de dados e que você quer enviar para o ejs.

O código dentro de cada uma das funções está certinho para obter os resultados do banco, mas não estão no lugar certo. Tanto a listaUfes quanto a listaCidades, vc só conseguirá acessar dentro da função de callback que vc passa como parâmetro para os DAOs aqui:

ufesDAO.lista(function(err, listaUfes) {
     codigo que precisa da listaUfes aqui
 });

E aqui:

cidadesDAO.lista(function(err, listaCidades) { 
     codigo que precisa da listaCidades aqui
});

Como no caso acima vc tem duas funções, com dois escopos diferentes, não há como executar um código que acesse as duas ao mesmo tempo. Se vc precisa que um mesmo código tenha acesso às duas, precisará juntar os dois códigos assim:

    ufesDAO.lista(function(err, listaUfes) {
        cidadesDAO.lista(function(err, listaCidades) { 
            codigo que precisa tanto de listaCidades quanto de listaUfes aqui
         });   
    });

Agora que vc tem acesso tanto a listaUfes quanto a listaCidades, só precisa decidir onde colocar esse código.

Caso queira executar o res.render enviando esses dados, o código ficaria assim:

ufesDAO.lista(function(err, listaUfes) {
        cidadesDAO.lista(function(err, listaCidades) { 
            res.render('cidades/frmcidadelista', {lista:listaCidades, siglas:listaUfes});
         });   
    });

Obrigado Arthur pela dica mas quando tentei desse jeito a listaUfes retorna valor mas listaCidades não, ai testei trocando elas de lugar e percebi que sempre a segunda chamada não retorna o valor, testei as chamada separadas pra ver se não é algum erro nas minhas DAOs mas separadas retornam valor, juntas não.

ufesDAO.lista(function(err, listaUfes) {
        cidadesDAO.lista(function(err, listaCidades) { 
            res.render('cidades/frmcidadelista', {lista:listaCidades, siglas:listaUfes});
         });   
    });

o retorno da variável err é Error: Cannot enqueue Query after invoking quit. mas só fecho a conexão depois de executar tudo que preciso nela.
solução!

Oi Rodrigo,

Se apenas juntar as duas chamadas como estão no seu código, não vai conseguir acessar o segundo resultado mesmo , por causa do nome dado aos dois parâmetros: result:

ufesDAO.lista(function(err, result) {
        cidadesDAO.lista(function(err, result) { 
            res.render('cidades/frmcidadelista', {lista:listaCidades, siglas:listaUfes});
         });   
    });

É preciso diferenciar o parâmetro do callback das Ufes do parâmetro do callback das Cidades:

ufesDAO.lista(function(err, listaUfes) {
        cidadesDAO.lista(function(err, listaCidades) { 
            res.render('cidades/frmcidadelista', {lista:listaCidades, siglas:listaUfes});
         });   
    });

Caso ainda não consiga acessar a listaCidades, provavelmente o cidadesDAO é que não está passando o resultado para o callback

    app.get('/cidades', function(req,res) {
        var connection = app.infra.connectionFactory();
        var ufesDAO = new app.infra.UfesDAO(connection);
        var cidadesDAO = new app.infra.CidadesDAO(connection); 

        cidadesDAO.lista(function(err, listaCidades) { 
                console.log({lista:listaCidades});
        });        
        ufesDAO.lista(function(err, listaUfes) {
            console.log({siglas:listaUfes});
        });        

        cidadesDAO.lista(function(err, listaCidades) {     
            ufesDAO.lista(function(err, listaUfes) {
                console.log(err);
                console.log({lista:listaCidades, siglas:listaUfes});
                res.format({
                            html: function() {                                
                                res.render('cidades/frmcidadelista', {lista:listaCidades, siglas:listaUfes});
                            },
                            json: function() {
                                res.json({lista:listaCidades, siglas:listaUfes});
                            }
                        });
            });     
        });

        connection.end();        
    });

a variável err é Error: Cannot enqueue Query after invoking quit. mas só fecho a conexão depois de executar tudo que preciso nela.

Muito obrigado pela ajuda consegui resolver este ultimo erro, era posição do end do connection, ela precisa ser fechada no final da segunda solicitação.

cidadesDAO.lista(function(err, listaCidades) {     
            ufesDAO.lista(function(err, listaUfes) {
                console.log(err);
                console.log({lista:listaCidades, siglas:listaUfes});
                res.format({
                            html: function() {                                
                                res.render('cidades/frmcidadelista', {lista:listaCidades, siglas:listaUfes});
                            },
                            json: function() {
                                res.json({lista:listaCidades, siglas:listaUfes});
                            }
                        }); 
                connection.end();
            });     
        });

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