1
resposta

Mais de um parâmetro passado para o Marko

Boa tarde!

Estou alterando um pouco a aplicação, para ver se consigo abstrair os conceitos aqui utilizados.

Vamos lá:

Estou montando um sistema simples, como prova de conceito, que tem 2 tabelas no MySql (Uma para pacientes e outra para convênios)

a tabela de pacientes tem os campos de Nome, Valor por Sessão e Convênio (além do id). A tabela de convênios tem o id e nome do convênio.

Minha dúvida é:

Quero criar uma página, em que o usuário possa marcar uma consulta, com base nos Pacientes e Convênios cadastrados. Já consegui implementar uma lista de pacientes e uma lista de convênios(de forma separada), mas não sei como passar os 2 resultados para o Marko:

EX: no código original, o marko vai acessar a variável "livros" e passamos os resultados.

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

const livroDao = new LivroDao(db);

livroDao.lista(function(erro, resultados) {

    resp.marko(
        require('../views/livros/lista/lista.marko'),
        {
            livros: resultados
        }

    );

});

});

como eu poderia fazer 2 queries em tabelas diferentes e passar para o Marko? Passar num array?

A minha aplicação tem a seguinte estrutura:

//------pasta da aplicação

//----- config: custom-express.js

//----- infra: conexao.js, tabelas.js

//----- models: atendimentos.js, convenios.js

//----- views: marcar.marko, principal.marko

segue o link para o github: github.com/henriquefaggion/enviarAlura

no meu código, a página de marcar uma consulta seria a "marcar.marko".

para listar os pacientes, eu precisaria passar algo do tipo:

resp.marko( require('../views/marcar.marko'), { pacientes: resultados1, convenios: resultados2 }

, onde resultados1 seriam os resultados da query da tabela de pacientes e resultados 2 , da tabela de convênios.

Poderiam me ajudar, por gentileza?

Obrigado

1 resposta

Olá Henrique, tudo bem com você?

O segundo parâmetro do resp.marko é o objeto onde podemos inserir tudo que queremos passar para view, então teríamos mesmo:

resp.marko( require('../view/marcar.marko'), {
    pacientes: resultado1,
    convenios: resultado2
})

Acredito que o seu problema seria como fazer as 2 requisições para passar os dados, correto?

Para isso podemos utilizar o método Promises.all que recebe um array de promises que deve ser executado, por exemplo:

No meu caso eu irei utilizar as tabelas que temos no projeto: usuarios e livros mas não mudaria nada para o seu exemplo:

  1. Irei criar um método semelhante ao livroDao.lista() mas deixarei ele mais resumido
const buscaUsuarios = new Promise((resolve, reject) => {
       db.all("SELECT * FROM usuarios", (err, resp) => {
           resolve(resp);
    })
});

Veja que só estou fazendo uma consulta ao banco de dados, não estou tratando erros ou coisa do tipo, apenas para ficar simples

Agora vamos para o Promises.all:

        Promise.all([
            buscaUsuarios,
            livroDao.lista()
        ])

Eu estou passando então todas as Promises que eu preciso dos dados, a de buscaUsuario e o lista

Irei fazer um .then( resultado => console.log(resultado)) para que você veja o resultado:

[
  [
    {
      id: 1,
      nome_completo: 'Gabriel Leite',
      email: 'gabriel@alura.com.br',
      senha: '123'
    },
    {
      id: 2,
      nome_completo: 'Geovani',
      email: 'geovani@alura.com.br',
      senha: '123'
    }
  ],  
  [
    {
      id: 1,
      titulo: 'Node na prática',
      preco: 30,
      descricao: 'Como desenvolver com Node.'
    },
    {
      id: 2,
      titulo: 'JavaScript na prática',
      preco: 40,
      descricao: 'Como desenvolver com JavaScript.'
    }
  ]
]

Então o resultado é um arraycom 2 elementos, cada elemento também é um array com a resposta da consulta

Dessa forma o que eu irei fazer é utilizar um recurso chamado destructuring assignment que funciona basicamente assim:

[ resultado1, resultado2] = resposta

O primeiro elemento da resposta será o conteúdo da variável resultado1, e o segundo elemento o do resultado2

Dessa forma teremos algo assim:

        Promise.all([
            buscaUsuarios,
            livroDao.lista()
        ])
        .then(
            ([resultado1, resultado2 => { 
                return resp.marko(
                    require('../views/livros/lista/lista.marko'),
                    {
                        usuarios: resultado1,
                        livros: resultado2
                    }
                );
            }
        )

Apenas uma consideração, neste caso eu não acrescentei o catch, mas podemos colocar normalmente, entretanto temos uma diferença, basta 1 promise falhar do nosso array, que ele irá diretamente para o catch

Qualquer coisa estou a disposição :)

Abraços e Bons Estudos!