Solucionado (ver solução)
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!