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.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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.
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|
14|
<%= lista[i].id %>
<%= 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.