22
respostas

Cannot read property 'length' of undefined

Olá galera.

Assim como nosso amigo Guilherme Felipe de Lima, meu código está exatamente igual ao do capítulo 2, mas no meu caso o erro não é a senha do BD, está em branco assim como no exercício. Já olhei várias vezes e não consigo achar o problema.

22 respostas

O meu esta com o mesmo problema. Já instalei o pacote EJS no visual estudio code, mas não resolveu.

Poderia postar o código completo e o erro que apresenta na hora de rodar.

Além de as versões do Node, NPM, EJS e outras dependências que esteja utilizando.

Versões: Node v8.11.4 npm v5.6.0 ejs v2.6.1 express v4.16.3 express-load v1.1.16 mysql v2.16.0 nodemon v1.18.4

Erro completo TypeError: C:\Users\R\Documents\Dev\Node\casadocodigo\app\views\produtos\lista.ejs:11 9| 10|

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

13|
<%= lista[i].id %>
14|
<%= lista[i].titulo %>

Cannot read property 'length' of undefined at eval (eval at compile (C:\Users\R\Documents\Dev\Node\casadocodigo\node_modules\ejs\lib\ejs.js:618:12), :11:29) at returnedFn (C:\Users\R\Documents\Dev\Node\casadocodigo\node_modules\ejs\lib\ejs.js:653:17) at tryHandleCache (C:\Users\R\Documents\Dev\Node\casadocodigo\node_modules\ejs\lib\ejs.js:251:36) at View.exports.renderFile [as engine] (C:\Users\R\Documents\Dev\Node\casadocodigo\node_modules\ejs\lib\ejs.js:482:10) at View.render (C:\Users\R\Documents\Dev\Node\casadocodigo\node_modules\express\lib\view.js:135:8) at tryRender (C:\Users\R\Documents\Dev\Node\casadocodigo\node_modules\express\lib\application.js:640:10) at Function.render (C:\Users\R\Documents\Dev\Node\casadocodigo\node_modules\express\lib\application.js:592:3) at ServerResponse.render (C:\Users\R\Documents\Dev\Node\casadocodigo\node_modules\express\lib\response.js:1008:7) at Query. (C:\Users\R\Documents\Dev\Node\casadocodigo\app\routes\produtos.js:7:17) at Query. (C:\Users\R\Documents\Dev\Node\casadocodigo\node_modules\mysql\lib\Connection.js:502:10)

Código É o projeto da Aula 2 https://s3.amazonaws.com/caelum-online-public/node.js/stages/capitulo-02-completo.zip

O MySQL Server instalado é a versão 8.0.12

Boa noite, Rodrigo! Como vai?

Vc poderia colar aqui o conteúdo do seu arquivo produtos.js? Com ele será possível ter uma ideia melhor da situação do seu projeto.

Boa noite. Travado c esse problema :)

module.exports = function(app) {
    app.get('/produtos', function(req, res) {
        var connection = app.infra.connectionFactory();
        var produtosDAO = new app.infra.ProdutosDAO(connection);

        produtosDAO.lista(function(err, results) {
            res.render('produtos/lista', {lista: results});            
        });

        connection.end();
    });
}

Rodrigo, a sua tabela no BD tem algum dado inserido ou está vazia? O que eu imagino que possa estar acontecendo é a tabela estar vazia e, por isso, o parâmetro results está ficando com o valor undefined.

Experimente fazer assim e veja se resolve:

res.render('produtos/lista', {lista: results ? results : []});

Se resolver e a tabela estiver realmente vazia, experimente inserir alguns registros na tabela e verifique se tudo continua funcionando como esperado.

A tabela veio vazia. Ao acessar o MySQL Workbench, me atentei que o SQL do curso criou a tabela 'livros' e o código em ProdutosDAO.js faz um 'select * from produtos'. Alterei o select para livros, mas mesmo a tabela tendo 3 linhas ela continuou retornando vazia ao acessar http://localhost:3000/produtos.

A solução parece estar embaixo do meu nariz e não vejo.

Rodrigo, poderia colar aqui o código do seu DAO, por favor?

function ProdutosDAO(connection) { this._connection = connection; }

ProdutosDAO.prototype.lista = function(callback) { this._connection.query('select * from livros',callback); }

module.exports = function(){ return ProdutosDAO; };

Rodrigo, volte o código do produtos.js para a versão anterior, fazendo como a seguir e veja se funciona:

res.render('produtos/lista', {lista: results});

Cheguei a pensar nisso também, mas infelizmente não funcionou. Voltou o erro 'Cannot read property 'length' of undefined'. Se a tabela não está vazia é como se o programa não encontrasse o BD. Já executei 'npm install mysql --save' novamente, inclusive no prompt como administrador, mas nada mudou.

No console do navegador e no terminal onde vc executou o comando para iniciar a aplicação aparare algum log de erro? Se sim, qual?

No console do navegador: 'Failed to load resource: the server responded with a status of 500 (Internal Server Error)'

No terminal aparece o mesmo erro do navegador 'Cannot read property 'length' of undefined', mas somente após tentar acessar no navegador. Antes aparece 'servidor rodando'.

Oloco! Faz o seguinte então, pra ficar mais fácil de eu analisar e te ajudar, vc poderia compartilhar o código comigo? É só colocar no github, google drive ou dropbox e mandar o link aqui que eu darei uma olhada! Não esqueça de remover a pasta node_modules antes de enviar o código.

Olá Gabriel. Por favor, descobriu algo errado no código?

Opa, Rodrigo! Retornei! Me desculpe pelo tempo sem responder!

Tenho uma notícia boa pra vc! Peguei o seu projeto, não mexi em nada nele, apenas criei o database casadocodigo_nodejs e a tabela livros como descrito nesse exercício e ele funcionou perfeitamente aqui!

E eu só consegui reproduzir o seu problema colocando um nome de database incorreto no connectionFactory.js ou colocando um nome de tabela incorreto no ProdutosDAO.js.

Sendo assim, meu chute é que vc tenha criado ou o database ou a tabela de forma incorreta.

Pra verificar, acesse no terminal o mysql com o comando mysqsl -u root -p sua-senha. Em seguida liste os databases com o comando show databases;. Na resposta, vc terá que ver o database casadocodigo_nodejs e caso não veja, terá descoberto o problema! Para resolver, basta criar o database e a tabela livros como é mostrado no exercício citado anteriormente. Se o database estiver correto, execute o comando use casadocodigo_nodejs; e em seguida show tables; onde deverá ser exibida a tabela livros. Caso ela não esteja listada então é esse o problema. E, para resolver, basta criar a tabela como mostrado no exerício citado.

Obs.: Não esqueça do ';' no final dos comandos indicados!

Qualquer coisa é só falar!

Grande abraço e bons estudos!

Olá Gabriel. Verifiquei conforme suas instruções e tanto o banco, quanto a tabela e o conteúdo dela estão corretos. Meu MYSQL deve estar bichado de alguma forma. Bem, vou arranjar outra máquina p tentar. Muitíssimo obrigado pela atenção.

Rodrigo, quando vc executa o comando mysql -u root na linha de comando do seu sistema operacional, qual o resultado? Vc consegue acessar normalmente o mysql sem nenhum erro?

Estou usando o Windows 7 Pro SP1. Quando instalei o MySQL foi instalado também o "MySQL 8.0 Command Line Client", é por esse console que entro com os comandos. No CMD do Windows não funciona.

Incluí "C:\Program Files\MySQL\MySQL Server 8.0\bin" no PATH do Windows. O comando mysql passou a funcionar no CMD, mas o programa da Casa do Código continua com o mesmo erro.