7
respostas

Erro ao tentar carregar dados da lista de produtos

Não sei o que esta acontecendo, poderiam me ajudar?

TypeError: /home/emerson/Documentos/NodeJs/casadocodigo/app/views/produtos/lista.ejs:11
    9|             </tr>
    10|             <tr>
 >> 11|                 <%for(var i=0;i<lista.length;i++){%>
    12|                     <tr>
    13|                         <td><%=lista[i].id%></td>
    14|                         <td><%=lista[i].titulo%></td> 

Cannot read property 'length' of undefined
    at eval (eval at compile (/home/emerson/Documentos/NodeJs/node_modules/ejs/lib/ejs.js:549:12), <anonymous>:11:27)
    at returnedFn (/home/emerson/Documentos/NodeJs/node_modules/ejs/lib/ejs.js:580:17)
    at tryHandleCache (/home/emerson/Documentos/NodeJs/node_modules/ejs/lib/ejs.js:223:34)
    at View.exports.renderFile [as engine] (/home/emerson/Documentos/NodeJs/node_modules/ejs/lib/ejs.js:437:10)
    at View.render (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/view.js:135:8)
    at tryRender (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/application.js:640:10)
    at Function.render (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/response.js:1008:7)
    at Query._callback (/home/emerson/Documentos/NodeJs/casadocodigo/app/routes/produto.js:12:17)
    at Query.Sequence.end (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/protocol/sequences/Sequence.js:88:24)
module.exports = function (app) {
    app.get('/produtos', function (req, res) {
        var mysql = require('mysql');
        var connection = mysql.createConnection({
            host:"localhost",
            user:"root",
            password:"",
            database:"casadocodigo",
        });

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

        connection.end();
    });
}
 <body>
        <table>
            <tr>
               <td>id</td>
               <td>titulo</td>
               <td>descricao</td> 
               <td>preco</td>  
            </tr>
            <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>
                <%}%> 
            </tr>
        </table>
    </body>
</html>
7 respostas

Oi Emerson, tudo bem? Você tem algum registro na sua tabela produtos? A conexão com o banco de dados está funcionando? O erro diz que a variável lista está indefinida.

Tenta dar um console.log na variável err, talvez ali tenha alguma dica de erro que possa estar acontecendo.

Oi Emerson,

O Node tá reclamando pq na linha 11 do seu código vc acessa a propriedade length de uma variável que vc chamou de lista; só que essa variável lista está vazia, está com valor undefined e aí ele te fala:

Cannot read property 'length' of undefined

A tradução é:

Não é possível ler a propriedade 'length' de algo que é undefined

Tente fazer um if pra verificar se o parâmetro erro lá no callback do mysql está vazio, e caso não esteja, faça um res.send(erro) para ver o erro que o mysql está dando.

O problema está relacionado ao acesso ao banco, você precisa verificar se o serviço do MySQL está ativo, se as credenciais referentes ao acesso ao banco estão corretas, e se a tabela que você está consultando existe no banco onde foi feita a conexão. Como foi sugerido acima, você precisa printar o erro no console. (variável err).

Uma forma de evitar o erro seria criar uma variavel vazia para enviar dados para a view, e se a consulta ao banco for feita com sucesso, preencher esta variável com o retorno (variável result). Seu código ficaria desta forma:

 connection.query('select * from produtos',function(err,result){
    var resultados = [];
    if (err){
        console.log(err);
    } else {
        resultados = result
    }
    res.render('produtos/lista',{lista:resultados});
});

Erro do console.

{ Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    at Handshake.Sequence._packetToError (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/protocol/sequences/Sequence.js:52:14)
    at Handshake.ErrorPacket (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/protocol/sequences/Handshake.js:130:18)
    at Protocol._parsePacket (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/protocol/Protocol.js:279:23)
    at Parser.write (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/protocol/Parser.js:76:12)
    at Protocol.write (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/protocol/Protocol.js:39:16)
    at Socket.<anonymous> (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/Connection.js:103:28)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211:7)
    at addChunk (_stream_readable.js:263:12)
    at readableAddChunk (_stream_readable.js:250:11)
    --------------------
    at Protocol._enqueue (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/protocol/Protocol.js:145:48)
    at Protocol.handshake (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/protocol/Protocol.js:52:23)
    at Connection.connect (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/Connection.js:130:18)
    at Connection._implyConnect (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/Connection.js:461:10)
    at Connection.query (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/Connection.js:206:8)
    at /home/emerson/Documentos/NodeJs/casadocodigo/app/routes/produto.js:11:20
    at Layer.handle [as handle_request] (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/router/layer.js:95:5)
  code: 'ER_NOT_SUPPORTED_AUTH_MODE',
  errno: 1251,
  sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client',
  sqlState: '08004',
  fatal: true }
TypeError: /home/emerson/Documentos/NodeJs/casadocodigo/app/views/produtos/lista.ejs:11
    9|             </tr>
    10|             <tr>
 >> 11|                 <%for(var i=0;i<lista.length;i++){%>
    12|                     <tr>
    13|                         <td><%=lista[i].id%></td>
    14|                         <td><%=lista[i].titulo%></td> 

Cannot read property 'length' of undefined
    at eval (eval at compile (/home/emerson/Documentos/NodeJs/node_modules/ejs/lib/ejs.js:549:12), <anonymous>:11:27)
    at returnedFn (/home/emerson/Documentos/NodeJs/node_modules/ejs/lib/ejs.js:580:17)
    at tryHandleCache (/home/emerson/Documentos/NodeJs/node_modules/ejs/lib/ejs.js:223:34)
    at View.exports.renderFile [as engine] (/home/emerson/Documentos/NodeJs/node_modules/ejs/lib/ejs.js:437:10)
    at View.render (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/view.js:135:8)
    at tryRender (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/application.js:640:10)
    at Function.render (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/express/lib/response.js:1008:7)
    at Query._callback (/home/emerson/Documentos/NodeJs/casadocodigo/app/routes/produto.js:18:17)
    at Query.Sequence.end (/home/emerson/Documentos/NodeJs/casadocodigo/node_modules/mysql/lib/protocol/sequences/Sequence.js:88:24)

select na minha tabela (Obs: estou utilizando linux mint)

Database changed
mysql> select * from produtos;
+----+--------------------------+--------------------------------------+-------+
| id | titulo                   | descricao                            | preco |
+----+--------------------------+--------------------------------------+-------+
|  1 | Comecando com nodejs     | livro introdutório sobre nodejs      | 39.90 |
|  2 | Comecando com javascript | livro introdutório sobre javascript  | 39.90 |
|  3 | Comecando com express    | livro introdutório sobre express     | 39.90 |
+----+--------------------------+--------------------------------------+-------+
3 rows in set (0,00 sec)

Opa Emerson, você tem um problema no seu código aparentemente. O erro tá informando que o cliente MySQL não suporta o protocolo de autenticação requerida pelo servidor, eu nunca vi esse tipo de erro.

Talvez não seja nem o seu código em si, mas verifica se você está usando a versão mais recente o MySQL e do pacote NPM também.

Isso parece algo relacionado a configuração do seu MySQL. Aqui tem algumas sugestões de como resolver este problema:

https://github.com/mysqljs/mysql/issues/1574

https://github.com/mysqljs/mysql/issues/1507

https://dev.mysql.com/doc/refman/5.5/en/old-client.html