Solucionado (ver solução)

Importante

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!

Solucionado
(ver solução)
15
respostas

lista is not defined

Olá, pessoal! Estou empacado nesse exercício, pois ao digitar o endereço no navegador, obtenho a seguinte mensagem: ReferenceError: c:\casadocodigo\app\views\produtos\lista.ejs:15 13| 14|

15| <% for (var i=0; i 16|

17| <%= lista[i].id %> 18| <%= lista[i].titulo %>

lista is not defined at eval (eval at (c:\casadocodigo\node_modules\ejs\lib\ejs.js:495:12), :11:24) at returnedFn (c:\casadocodigo\node_modules\ejs\lib\ejs.js:524:17) at View.exports.renderFile [as engine] (c:\casadocodigo\node_modules\ejs\lib\ejs.js:378:31) at View.render (c:\casadocodigo\node_modules\express\lib\view.js:126:8) at tryRender (c:\casadocodigo\node_modules\express\lib\application.js:639:10) at EventEmitter.render (c:\casadocodigo\node_modules\express\lib\application.js:591:3) at ServerResponse.render (c:\casadocodigo\node_modules\express\lib\response.js:960:7) at c:\casadocodigo\app.js:3:5 at Layer.handle [as handle_request] (c:\casadocodigo\node_modules\express\lib\router\layer.js:95:5) at next (c:\casadocodigo\node_modules\express\lib\router\route.js:131:13)

Abaixo seguem os códigos: app.js

var app = require('./config/express')();
app.get('/produtos', function(req, res) {
res.render('produtos/lista.ejs');
});
app.listen(3000, function() {
console.log("Servidor rodando!");
});

produtos.js

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

connection.end();
});
}

lista.ejs:


<html>

<head>
<title> Casa do Código</title>
</head>
<body>
<h1> Listagem de produtos</h1>

<table>
<tr>
<td> ID </td>
<td> Nome </td>
</tr>

    <% for (var i=0; i<lista.length; i++) {%>
    <tr>
    <td> <%= lista[i].id %></td>
<td> <%= lista[i].titulo %> </td>
<td> <%= lista[i].preco %> </td>
<td> <%= lista[i].descricao %> </td>

</tr>
<% } %>
</table>
</body>
</html>

Pelo que percebi, tudo se encontra conforme descrito na resolução do exercício. O que pode estar acontecendo?

15 respostas

Acho que essa dúvida pode te ajudar => https://cursos.alura.com.br/forum/topico-erro-cannot-read-property-length-of-undefined-24427

Provavelmente tem algum erro na sua query.. imprima o valor da variável err.

Olhei aqui e não consegui perceber nada de erro na query. O nome da tabela também é livros. Pedi para imprimir a variável err por meio do comando console.log(err);, mas nada apareceu. Como fazer para obter o valor dela?

Depende do local onde vc colocou o console.log. Vou dar o exemplo de onde seria.

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

Então, foi exatamente nesse local que inseri essa linha de código. O seu valor deveria aparecer ao digitar o endereço no browser?

Olá! Já tentei de tudo, mas não consigo desempacar desse exercício! A mensagem persiste em aparecer! O que poderá estar acontecendo?

Oi José, se for possível, sobe seu código no github e coloca o link aqui. Posso dar uma olhada e tentar achar.

Olá, Alberto! Como não sei ainda lidar com o github, coloquei o projeto no Dropbox, cujo endereço segue abaixo: https://dl.dropboxusercontent.com/u/21446103/casadocodigo.zip Desde já, agradeço a valiosa ajuda!

Rapaz. Notei varios erros, mas consegui concertar aqui, porem aconselho dar uma revisada no curso novamente, porque foram bastantes erros. Teu app.js estava com o código abaixo, logo não estava usando o código de conexão ao banco de dados. Entao tem que remover:

app.get('/produtos', function(req, res) {
res.render('produtos/lista.ejs');
});

Outro ponto que notei é que seu arquivo de configuração packages.json não continha o express-load, e nem o express.js estava utilizando pra apontar os arquivos que precisava carregar.

var express = require('express');
var load = require('express-load');

module.exports = function() {
  var app = express();

  app.set('view engine', 'ejs');
  app.set('views', './app/views');

  load('routes', {cwd: 'app'})
    .then('infra')
    .into(app);

  return app;
}

Também notei que existe uma virgula a mais no ultimo argumento do json da conexão, mas não sei se isso faz uma diferença, mas com certeza esta errado.

database : 'casadocodigo_nodejs' //nao tem virgula aqui
});

Outro ponto que notei que precisa melhorar é a identencao do seu código até pra facilitar a revisão de outras pessoas.

Olá, amigo! Fiz as alterações que sugeriu, porém agora recebo a mensagem "HTTP 404 - não encontrado". O package.json ficou assim:


{
  var express = require('express');
var load = require('express-load');

module.exports = function() {
  var app = express();

  app.set('view engine', 'ejs');
  app.set('views', './app/views');

  load('routes', {cwd: 'app'})
    .then('infra')
    .into(app);

  return app;
}
  "name": "casadocodigo",
  "version": "1.0.0",
  "description": "Aprendendo NodeJS",
  "main": "index.js",
  "dependencies": {
    "ejs": "^2.5.1",
    "express": "^4.14.0",
    "mysql": "^2.11.1"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Nilton",
  "license": "ISC"
}

O app.js ficou:

var app = require('./config/express')();

app.listen(3000, function() {
console.log("Servidor rodando!");
});

Já o produtos.js ficou:

module.exports=function (app) {
app.get('/produtos', function (req, res) {
var mysql = require('mysql');
var connection = mysql.createConnection( {
host: "localhost",
user: "root",
password: "nilton05",
database: "casadocodigo_nodejs"
});
connection.connect();
connection.query("select * from livros", function (err, results) {
console.log(err);
res.render('produtos/lista', {lista: results});
});

connection.end();
});
}

Como não enxergo, não atento muito para as identações, mas você tem razão, identando irei facilitar a vida de vocês que enxergam. Trabalharei isso depois. Obrigado pelas dicas e espero resolver essa questão para seguir o curso. Uma outra coisa: Em que momento eu deveria inserir os dados descritos por você no arquivo package.json? Não me lembro de tê-lo visto no curso. Um abraço!

Para inserir bibliotecas dentro do package.json voce precisa usar o comando --save no final apos instalar a biblioteca. Por ex, dentro do directório raiz do seu projeto, pelo terminal, você usaria esse comando: npm install express-load --save. Esta forma ele vai alem de instalar a biblioteca, incluir a seguinte linha no package.json dentro de "dependencies".

"express-load": "^1.1.15",

Ete o final do curso ficara assim:

  "dependencies": {
    "body-parser": "^1.15.2",
    "ejs": "^2.5.2",
    "express": "^4.14.0",
    "express-load": "^1.1.15",
    "express-validator": "^2.20.10",
    "mysql": "^2.11.1"
  }

Lembrando que a melhor forma de incluir a biblioteca é pelo comando --save, que ja instala ela pra você. Se você fosse fazer o download de um projeto onde so tivesse o package.json, ae você instalaria todas as bibliotecas apenas digitando: npm install. Ele iria ler o package.json e instalar todas elas no node_modules.

E realmente, continua sem o express-load no seu package.json, desta forma você não vai conseguir carregar os modules dinamicamente, pois esta biblioteca não vai estar dentro do directório node_modules que é onde as bibliotecas instaladas pelo npm ficam.

Obs: nao desista, eu ja fiz o curso umas três vezes, entao qualquer coisa refaca os capítulos, a única dificuldade que tive foi quando ele trocou a tabela livros por produtos e isso quebrou a query e a lista ficou undefined. Mas basta mudar novamente e seguir com a tabela livros, ou criar uma tabela produtos no Database como fez com anteriormente com livros e incluir algum dado.

Espero ter ajudado.

Olá! Após o comano "npm install express-load --save" o package.json ficou assim:

{
    var express = require('express');
var load = require('express-load');

module.exports = function() {
  var app = express();

  app.set('view engine', 'ejs');
  app.set('views', './app/views');

  load('routes', {cwd: 'app'})
    .then('infra')
    .into(app);

  return app;
}

  "name": "casadocodigo",
  "version": "1.0.0",
  "description": "Aprendendo NodeJS",
  "main": "index.js",
  "dependencies": {
    "ejs": "^2.5.1",
    "express": "^4.14.0",
    "express-load": "^1.1.15",
    "mysql": "^2.11.1"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Nilton",
  "license": "ISC"
}

Mesmo assim, continua aparecendo o erro HTTP 404 - não encontrado. Parece-me um problema com rotas, mas não sei qual. Não irei desistir, pois é resolvendo esses pequenos problemas que a gente realmente aprende! E lógico, com o auxílio de pessoas como você!!! Obrigado!

Mande o link com o zip com o código novamente, não precisa incluir a pasta node_modules nos zip.

Segue o link: https://dl.dropboxusercontent.com/u/21446103/casadocodigo.zip Obrigado!

Oi José, sem querer, vc copiou o código do express.js dentro do package.json. Faz exatamente do jeito que eu escrever aqui, ok?

Você tem um arquivo que chama package.json que está na raiz do seu projeto, o conteúdo dele deve ser o seguinte:

{
  "name": "casadocodigo",
  "version": "1.0.0",
  "description": "Aprendendo NodeJS",
  "main": "index.js",
  "dependencies": {
    "ejs": "^2.5.1",
    "express": "^4.14.0",
    "express-load": "^1.1.15",
    "mysql": "^2.11.1"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Nilton",
  "license": "ISC"
}

Você tem um outro arquivo, que chama express.js, que está localizado na pasta config. O conteúdo dele deve ser o seguinte:

var express = require('express');
var load = require('express-load');

module.exports = function() {
  var app = express();

  app.set('view engine', 'ejs');
  app.set('views', './app/views');

  load('routes', {cwd: 'app'})
    .then('infra')
    .into(app);

  return app;
}

O problema do seu projeto era realmente códigos em locais errados.

solução!

Olá,Alberto! Muito obrigado pelas valiosas dicas! Finalmente tudo funcionou a contento! Um abraço!