Solucionado (ver solução)
Solucionado
(ver solução)
26
respostas

Cannot read property 'length' of undefined

Boa noite, Estou na aula 2.3 node js e não consigo puxar as informações do banco de dados. Dá o seguinte erro:

Servidor rodando
TypeError: C:/Users/GabrielVellosodeAlbu/WebstormProjects/nodejs_alura_01/casadocodigo/app/views/produtos/lista.ejs:10
    8|         <td>preco</td>
    9|     </tr>
 >> 10|     <% for(var i=0; i<lista.length; i++) {%>
    11|     <tr>
    12|         <td><%= lista[i].id %></td>
    13|         <td><%= lista[i].titulo; %></td>

Cannot read property 'length' of undefined
    at eval (eval at <anonymous> (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\ejs\lib\ejs.js:485:12), <anonym
ous>:13:28)
    at returnedFn (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\ejs\lib\ejs.js:514:17)
    at View.exports.renderFile [as engine] (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\ejs\lib\ejs.js:358:31
)
    at View.render (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\express\lib\view.js:126:8)
    at tryRender (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\express\lib\application.js:639:10)
    at EventEmitter.render (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\express\lib\application.js:591:3)
    at ServerResponse.render (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\express\lib\response.js:960:7)
    at Query._callback (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\app\routes\produtos.js:15:20)
    at Query.Sequence.end (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\mysql\lib\protocol\sequences\Sequence.
js:85:24)
    at C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\mysql\lib\protocol\Protocol.js:399:18
26 respostas

Ele não está achando lista. posta pra gente o seu lista.ejs também. Use o " inserir código" para que o código saia formatado

bom dia Paulo. Então eu peguei a lista do próprio tutorial uma vez que a minha estava dando errado. Segue a lista .

<html>
<body>
<table>
    <tr>
        <td>id</td>
        <td>titulo</td>
        <td>descricao</td>
        <td>preco</td>
    </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>
    <% } %>
</table>
</body>
</html>

Att Gabriel.

Seguen tabelas criadas no mysql.

mysql> show tables;
+-------------------------------+
| Tables_in_casadocodigo_nodejs |
+-------------------------------+
| livros                        |
+-------------------------------+
1 row in set (0.00 sec)

mysql> dec livros;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version f
or the right syntax to use near 'dec livros' at line 1
mysql> show tables;
+-------------------------------+
| Tables_in_casadocodigo_nodejs |
+-------------------------------+
| livros                        |
+-------------------------------+
1 row in set (0.00 sec)

mysql> desc livros;
+-----------+---------------+------+-----+---------+----------------+
| Field     | Type          | Null | Key | Default | Extra          |
+-----------+---------------+------+-----+---------+----------------+
| id        | int(11)       | NO   | PRI | NULL    | auto_increment |
| titulo    | varchar(255)  | YES  |     | NULL    |                |
| descricao | text          | YES  |     | NULL    |                |
| preco     | decimal(10,2) | YES  |     | NULL    |                |
+-----------+---------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> select * from livros;
+----+--------------------------+-------------------------------------+-------+
| 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)

segue ainda os códigos da rota produtos.

// roatas do sistema
module.exports = function(app){
    app.get('/produtos',function(request, response){

       var mysql = require('mysql'); //listando os produtos no mysql
       var connection = mysql.createConnection({ // preparando mysql
           host: 'localhost',
           user: 'root',
           password: '',
           database: 'casadocodigo_nodejs'
       });


      connection.query('selct * from livros', function(err,results){
          response.render('produtos/lista',{lista: results});
      });
        connection.end();
    });

}

Se preciso eu coloco o código todo aqui. Se tiver como de dar um retorno fico grato. Att. Gabriel.

Fiz o passo a passo de vocês ... pude observar que tem mais gente com o problema .... o que poderia ser. Se quiserem eu zip e envio o código para darem uma olhada . Por favor me deem um retorno o quanto antes ... so tenho essa semana para me dedicar mais afundo gostaria de terminar esse curso. Att. Gabriel.

Erro na query. connection.query('selct * from livros')

correto: ('select * from livros');

Espero ter ajudado.

Victor matou! Só para complementar, o primeiro argumento de todo callback no nodejs é justamente o possível erro da execução assíncrona. Você pode testar para ver se a variável está diferente de undefined.

Boa noite Vitor, Então eu mexi muito no código já afim de achar o erro. Eu fiz o passo a passo e realmente esse erro não sai. Vou postar aqui o código inteiro acho melhor. O erro ainda permanece.

diretório app -- dentro está produto.js

// roatas do sistema
module.exports = function(app){
    app.get('/produtos',function(request, response){

       var mysql = require('mysql'); //listando os produtos no mysql
       var connection = mysql.createConnection({ // preparando mysql
           host: 'localhost',
           user: 'root',
           password: '',
           database: 'casadocodigo_nodejs',
       });


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

}
i

View eu já coloquei está mais para cima.

//config/express.js



module.exports = function() {
var app = require('express')();
    app.set('view engine','ejs');
    app.set('views' , './app/views'); // configura a nova rota de views ..    ./ o barra ponto fala para a aplicação que a partir do ponto aonde o servidor é levantado, a busca deve ser iniciada.
    return app;
}

app.js

  var app  = require('./config/express.js')();
    var rotaProdutos = require('./app/routes/produtos')(app);



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

    });

Oi Gabriel. Como o Alberto falou, você precisa verificar as variáveis de erro. Provavelmente é algo com seu ambiente e não vai adianta executarmos por aqui. Por exemplo, no callback que executa o sql, você deve imprimir/verificar a variável err

Opa paulo, então me parece ser um erro que não vou consegui resolver.

A forma como o exercício lista os produtos não me pareceu consistente ... apenas na hora de puxar a lista ..... tem vários erros parecidos na internet.

Acho que não vou consegui revolver mas blz.

Vou iniciar o angular .... tento refazer do zero tudo de novo.

OBS:"Por exemplo, no callback que executa o sql, você deve imprimir/verificar a variável err"

Isso já foi feito já tentei inúmeras dicas nos sites ... mas o erro não sai.

att. Gabriel.

Vai conseguir sim Gabriel! Mas precisa imprimir todos os err de todos os callbacks e mostrar pra gente o resultado que aparece antes desse erro da linha 10.

Então Paulo o erro apresentado segue abaixo.

Servidor rodando
TypeError: C:/Users/GabrielVellosodeAlbu/WebstormProjects/nodejs_alura_01/casadocodigo/app/views/produtos/lista.ejs:10
    8|         <td>preco</td>
    9|     </tr>
 >> 10|     <% for(var i=0; i<lista.length; i++) {%>
    11|     <tr>
    12|         <td><%= lista[i].id %></td>
    13|         <td><%= lista[i].titulo %></td>

Cannot read property 'length' of undefined
    at eval (eval at <anonymous> (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modu
les\ejs\lib\ejs.js:485:12), <anonymous>:13:28)
    at returnedFn (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\ejs\lib\ejs
.js:514:17)
    at View.exports.renderFile [as engine] (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo
\node_modules\ejs\lib\ejs.js:358:31)
    at View.render (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\express\li
b\view.js:126:8)
    at tryRender (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\express\lib\
application.js:639:10)
    at EventEmitter.render (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\ex
press\lib\application.js:591:3)
    at ServerResponse.render (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\
express\lib\response.js:960:7)
    at Query._callback (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\app\routes\produtos
.js:15:20)
    at Query.Sequence.end (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\mys
ql\lib\protocol\sequences\Sequence.js:85:24)
    at C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\mysql\lib\protocol\Prot
ocol.js:399:18
TypeError: C:/Users/GabrielVellosodeAlbu/WebstormProjects/nodejs_alura_01/casadocodigo/app/views/produtos/lista.ejs:10
    8|         <td>preco</td>
    9|     </tr>
 >> 10|     <% for(var i=0; i<lista.length; i++) {%>
    11|     <tr>
    12|         <td><%= lista[i].id %></td>
    13|         <td><%= lista[i].titulo %></td>

Cannot read property 'length' of undefined
    at eval (eval at <anonymous> (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modu
les\ejs\lib\ejs.js:485:12), <anonymous>:13:28)
    at returnedFn (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\ejs\lib\ejs
.js:514:17)
    at View.exports.renderFile [as engine] (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo
\node_modules\ejs\lib\ejs.js:358:31)
    at View.render (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\express\li
b\view.js:126:8)
    at tryRender (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\express\lib\
application.js:639:10)
    at EventEmitter.render (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\ex
press\lib\application.js:591:3)
    at ServerResponse.render (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\
express\lib\response.js:960:7)
    at Query._callback (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\app\routes\produtos
.js:15:20)
    at Query.Sequence.end (C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\mys
ql\lib\protocol\sequences\Sequence.js:85:24)
    at C:\Users\GabrielVellosodeAlbu\WebstormProjects\nodejs_alura_01\casadocodigo\node_modules\mysql\lib\protocol\Prot
ocol.js:399:18

É o que aparece e todo o erro ..... que aparece.

Está claro que ele não consegue ler a lista .... mas esse erro do

Cannot read property 'length' of undefined

tem se mostrado corriqueira na internet ... acredito que seja a forma como estamos tentando puchar a lista.

Olá Gabriel, eu estava com esse problema e resolvi dessa forma, coloquei o console.log(err) para me mostrar o que estava acontecendo e vi que era um erro de tabela, tenta por assim e ver o que te retorna, re tenta logar todos os erros das funções de callbacks.


        produtosBanco.lista(connection,function(err, results){
            console.log(err);
            response.render('produtos/lista', {lista:results});
        });

Gabriel, é exatamente essa info que o William tambem falou que precisamos. é esse err que precisamos saber. É quem originou o outro. Provavelmente o select no banco de dados não está funcionando e por isso a lista volta undefined

Bom dia Willian tudo bom. Então segui sua orientação segue o erro.

Servidor rodando
{ [Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: NO)]
  code: 'ER_ACCESS_DENIED_ERROR',
  errno: 1045,
  sqlState: '28000',
  fatal: true }
TypeError: C:/Users/GabrielVellosodeAlbu/Webstorm BACKUP/nodejs_alura_01/casadocodigo/app/views/produtos/lista.ejs:10
    8|         <td>preco</td>
    9|     </tr>
 >> 10|     <% for(var i=0; i<lista.length; i++) {%>
    11|     <tr>
    12|         <td><%= lista[i].id %></td>
    13|         <td><%= lista[i].titulo %></td>

Cannot read property 'length' of undefined
    at eval (eval at <anonymous> (C:\Users\GabrielVellosodeAlbu\Webstorm BACKUP\nodejs_alura_01\casadocodigo\node_modules\ejs\lib\ejs.js:485
:12), <anonymous>:13:28)
    at returnedFn (C:\Users\GabrielVellosodeAlbu\Webstorm BACKUP\nodejs_alura_01\casadocodigo\node_modules\ejs\lib\ejs.js:514:17)
    at View.exports.renderFile [as engine] (C:\Users\GabrielVellosodeAlbu\Webstorm BACKUP\nodejs_alura_01\casadocodigo\node_modules\ejs\lib\
ejs.js:358:31)
    at View.render (C:\Users\GabrielVellosodeAlbu\Webstorm BACKUP\nodejs_alura_01\casadocodigo\node_modules\express\lib\view.js:126:8)
    at tryRender (C:\Users\GabrielVellosodeAlbu\Webstorm BACKUP\nodejs_alura_01\casadocodigo\node_modules\express\lib\application.js:639:10)

    at EventEmitter.render (C:\Users\GabrielVellosodeAlbu\Webstorm BACKUP\nodejs_alura_01\casadocodigo\node_modules\express\lib\application.
js:591:3)
    at ServerResponse.render (C:\Users\GabrielVellosodeAlbu\Webstorm BACKUP\nodejs_alura_01\casadocodigo\node_modules\express\lib\response.j
s:960:7)
    at Query._callback (C:\Users\GabrielVellosodeAlbu\Webstorm BACKUP\nodejs_alura_01\casadocodigo\app\routes\produtos.js:16:20)
    at Query.Sequence.end (C:\Users\GabrielVellosodeAlbu\Webstorm BACKUP\nodejs_alura_01\casadocodigo\node_modules\mysql\lib\protocol\sequen
ces\Sequence.js:85:24)
    at C:\Users\GabrielVellosodeAlbu\Webstorm BACKUP\nodejs_alura_01\casadocodigo\node_modules\mysql\lib\protocol\Protocol.js:399:18

Ele está dizendo que o seu mysql não dá acesso com login root e senha vazia. Faça o teste e verifique isso manualmente na linha de comando, fazendo mysql e digitando root/vazio. Aí altere o login/senha de acordo no seu codigo

Opa Paulo tudo bom. Então velho me tira uma duvida do mysl. Ele não tem que startar como o mongo tem? Eu apenas inseri os dados no Banco e fiz o que se pede na aula. Essa parte to um pouco com duvida. No mongo eu tenho que definir user root localhost etc ... será que isso? Eu instalei igual um tutorial que tem sobre banco mysql sem alterar nada. Att. Gabriel.

solução!

Se não me engano precisa startar ele sim, porém eu uso pelo xampp e não sei como faria sem ele X. X Estou no celular, mas a noite tento encontrar algo e te passo aqui

OK

Gabriel, avise se deu certo. Se não estiver conseguindo abrir o mysql/conectar, abre uma nova duvida mandando o erro?

Fala Gabriel

Alguns links man https://coolestguidesontheplanet.com/start-stop-mysql-from-the-command-line-terminal-osx-linux/

http://ftp.nchu.edu.tw/MySQL/doc/refman/4.1/pt/automatic-start.html

http://www.devfuria.com.br/sql/mysql-pelo-terminal/

Mas como vc inseriu os dados acredito que no momento ele já estava iniciado, tenha certeza que seu usuário não tenha senha, ou então teste, user 'root' e senha 'root' ou ainda pode tentar criar um novo usuário

Eu vou dar uma olhada depois com mais clama. Obrigado pelo retorno. Att.

"Se não me engano precisa startar ele sim, porém eu uso pelo xampp e não sei como faria sem ele X. X Estou no celular, mas a noite tento encontrar algo e te passo aqui"

O xampp resolveu o problema. Obrigado.