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

Erro para renderizar a lista.ejs

O código está igual ao da aula contudo ele apresenta erro para renderizar a página no navegador.

produtos.js

module.exports = function(app){
    app.get('/produtos', function(req,res){
        var mysql = require('mysql');
        var connection = mysql.createConnection({
            host : 'localhost',
            user : 'pprimon',
            password : '123456',
            database : 'casadocodigo_nodejs'
        });
        connection.query('select * from livros', function(error, results){
            res.render('produtos/lista',{lista:results});
        });
        connection.end();
    });
}

lista.ejs

<html>
    <head>
        <title>
            Lista de Produtos
        </title>
    </head>
    <body>
        <table>
            <tr>
                <td>id</td>
                <td>titulo</td>
                <td>descricao</td>
                <td>preco</td>
            </tr>
            <%for(var i = 0; i < lista.length; i++){%>
            <tr>
                <td> <%=lista[i].id%> </td>
                   <td> <%=lista[i].titulo%> </td>
                   <td> <%=lista[i].descricao%> </td>
                   <td> <%=lista[i].preco%> </td>
            </tr>
            <%}%>
        </table>
    </body>
</html>

Erro apresentado no console

TypeError: /Users/elmac-000023/teste-node/app/views/produtos/lista.ejs:15
    13|                 <td>preco</td>
    14|             </tr>
 >> 15|             <%for(var i = 0; i < lista.length; i++){%>
    16|             <tr>
    17|                 <td> <%=lista[i].id%> </td>
    18|                    <td> <%=lista[i].titulo%> </td>

Cannot read property 'length' of undefined
    at eval (eval at compile (/Users/elmac-000023/teste-node/node_modules/ejs/lib/ejs.js:618:12), <anonymous>:11:32)
    at returnedFn (/Users/elmac-000023/teste-node/node_modules/ejs/lib/ejs.js:653:17)
    at tryHandleCache (/Users/elmac-000023/teste-node/node_modules/ejs/lib/ejs.js:251:36)
    at View.exports.renderFile [as engine] (/Users/elmac-000023/teste-node/node_modules/ejs/lib/ejs.js:482:10)
    at View.render (/Users/elmac-000023/teste-node/node_modules/express/lib/view.js:135:8)
    at tryRender (/Users/elmac-000023/teste-node/node_modules/express/lib/application.js:640:10)
    at Function.render (/Users/elmac-000023/teste-node/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/Users/elmac-000023/teste-node/node_modules/express/lib/response.js:1008:7)
    at Query.<anonymous> (/Users/elmac-000023/teste-node/app/routes/produtos.js:11:17)
    at Query.<anonymous> (/Users/elmac-000023/teste-node/node_modules/mysql/lib/Connection.js:502:10)
8 respostas

Oi Kaique, tudo bem? Muito provavelmente está acontecendo algum problema no select do banco. Seja algo na conexão, o nome do banco, etc.

Digo isso por que o "lista" que está enviando para a view, está indo como undefined.

Oi Wanderson,

Já conferi todas essas informações, inclusive consegui fazer o select direto no banco pelo terminal usando o msm database, user, senha, e comando select * from livros e deu tudo certo. Também já conferi as chamas e ao que parece está tudo certo com o código da aula.

também estou com o mesmo problema, por favor alguém nos ajude Este problema está em vários usuários, e parece ser do mysql mesmo, já segui algumas dicas e nenhuma funcionou, inclusive segui a dica de criar novo usuário e dar todos os privilégios de root, desinstalar e reinstalar e nada adiantou.... será a versão do ejs? o meu é o 2.6.1 Por favor nos dê outra alternativa de banco, sqlserver, mongoDB, oracle

No select, deixem o código como está abaixo pra gente ver mais detalhes do que pode estar acontecendo:

 connection.query('select * from livros', function(error, results){
    console.log("fazendo select: ");
    console.log("========================= ");
    console.log(error, results);
    console.log("========================= ");
    res.render('produtos/lista',{lista:results});
});

Olhem os logs e colem aqui as mensagens. Os traços são só pra facilitar encontrar as mensagens nos logs do heroku.

Encontrei a solução:

10| <% for(var i=0; i<lista.length; i++) { %>

só colocar o lista. antes do length

Boa Alessandro, infelizmente esse não é o mesmo problema do Kaique. Kaique, estou esperando seu feedback aqui, tá bem?

solução!

Wanderson, Bom dia!

Consegui achar a solução, para quem está usando o MySql 8:

ALTER USER 'root'@'localhost' IDENTIFIED BY ''; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

e quando chamar o código fica assim:

var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : '', database : 'casadocodigo_nodejs'

    });

Entendi Kaique, de fato era algo relacionado ao banco hein? Bom, fico feliz que tenha resolvido.

Abraço e bons estudos!