8
respostas

Problema ao trazer os dados do banco

Montei um projeto seguinda as aulas do curso mas estou com problemas para trazer os dados do banco.

Meu codigo de conexao, dbconnection.js:

var mysql = require('mysql')

module.exports = () => {
  return mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'casadocodigo'
  })
}

Meu código para exibir os produtos.js:

var connection = require('../infra/dbconnection.js')();

module.exports = (app) => {
  app.get('/produtos/', (req, res) => {

    connection.query('select * from livros', function(err, results){
      res.render('produtos/produtos', {livros: results});      
    })
  })

  connection.end()
}

Ao acessar a página de produtos ele dá esse erro:

Cannot read property 'forEach' of undefined

Percebi que ele pára de exibir o erro quando removo a linha abaixo, do arquivo produtos.js:

 connection.end()

Mas preciso em algum momento fechar a conexão certo? Qual o lugar certo para fazer isso?

Abs

8 respostas

Oi Felipe, tudo bem? Posta o código da view pra gente ver aqui o que pode ser? Esse erro não me parece ser da conexão em si.

O código da view é esse:

<h1>Produtos</h1>
  <table>
    <thead>
      <tr>
        <td>código</td>
        <td>titulo</td>
        <td>descricao</td>
        <td>preco</td>
      </tr>
    </thead>
    <tbody>
      <%livros.forEach(function(livro){%>
      <tr>
        <td>
          <%=livro.id%>
        </td>
        <td>
          <%=livro.titulo%>
        </td>
        <td>
          <%=livro.descricao%>
        </td>
        <td>
          <%=livro.preco%>
        </td>     
      </tr>
      <%})%>
    </tbody>
  </table>

Felipe, o erro diz que não foi possível executar o forEach por que a variável livros está indefinida na view, acho que pode estar acontecendo algum erro na consulta e você não está verificando isso. Faz o seguinte, põe um console.log tanto na variável de erro quanto na de result e cola aqui essas duas saidas por favor.

Veja a saida dos console. Lembrando que só dá esse erro quando coloco o connection.end() logo após o connection.query()

results:

undefined

erro:

erro: Error: Cannot enqueue Query after invoking quit.
TypeError: ...node\app\views\produtos\produtos.ejs:24
    22|     </thead>
    23|     <tbody>
 >> 24|       <%livros.forEach(function(livro){%>
    25|       <tr>
    26|         <td>
    27|           <%=livro.id%>

Cannot read property 'forEach' of undefined
    at eval (eval at compile (...node\node_modules\ejs\lib\ejs.js:524:12), <anonymous>:24:13)
    at returnedFn (...node\node_modules\ejs\lib\ejs.js:555:17)
    at tryHandleCache (...node\node_modules\ejs\lib\ejs.js:203:34)
    at View.exports.renderFile [as engine] (...node\node_modules\ejs\lib\ejs.js:412:10)
    at View.render (...node\node_modules\express\lib\view.js:128:8)
    at tryRender (...node\node_modules\express\lib\application.js:640:10)
    at Function.render (...node\node_modules\express\lib\application.js:592:3)
    at ServerResponse.render (...node\node_modules\express\lib\response.js:971:7)
    at Query._callback (...node\app\routes\produtos.js:8:11)
    at Query.Sequence.end (...node\node_modules\mysql\lib\protocol\sequences\Sequence.js:86:24)

Felipe, é um problema de assincronia, quando a chamada do end tá presente do jeito que você colocou, ele vai ser executado antes da consulta ter sido executada e retornada com o resultado. A solução mais simples é você usar o método end depois do query da seguinte forma:

connection.query('select * from livros', function(err, results){
    res.render('produtos/produtos', {livros: results});      
}).end()

Inseri o .end() da forma que vc passou mas o erro continua.

Você reiniciou o servidor depois disso? Está usando o nodemon?

Tem como você por seu código no github pra gente dar uma olhada?