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

ProdutosDAO is not a function

Bom. Aqui vai o produtosDAO.js

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

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

ProdutosDAO.prototype.salva = function(livro, callback){
    this._connection.query('insert into livros SET ?', livro, callback);
}

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

E aqui o app.get do produtos.js

app.get('/produtos', function(req, res){

        var connection = app.infra.connectionFactory;
        var produtosDAO = new app.infra.ProdutosDAO(connection);

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

        connection.end();
        //res.render('produtos/lista');
    });
10 respostas

Acredito que esteja aqui var connection = app.infra.connectionFactory;

A connection precisa ser executada por isso deve ser passada como var connection = app.infra.connectionFactory();

Não. Acredito que não é esse o caso. Até porque ele lê o connectionFactory antes de tentar ler o produtosDAO.

Oi Alex,

O express-load é responsável por montar a sua variável app. Pra criar um app.infra.ProdutoDAO, imagino que ele esteja olhando pelo nome do arquivo. Como você chamou de produtoDAO.js ele não conseguiu criar um app.infra.ProdutoDAO. Uma solução pode ser renomear o arquivo ou acessar app.infra.produtoDAO.

Oi Artur. Obrigado pela resposta. Não consegui identificar a sua observação. Imagino que seja aqui:

var produtosDAO = new app.infra.ProdutosDAO(connection);

Mas foi criado como ProdutosDAO e não ProdutoDAO. Ou você se refere ao nome do arquivo??

Me referi ao nome do arquivo, sim =) Tente deixar igualzinho ao nome da propriedade ProdutosDAO, com a primeira letra maiúscula e tudo. Como o JS é case sensitive provavelmente o express-load está criando um app.infra.produtosDAO e não um app.infra.ProdutosDAO

Aí Artur. Resolveu. Era esse o problema, o nome do arquivo. Mas agora é outro...

this._connection.query is not a function!

Dá uma força aí!!

Agora é o que eu tinha falado antes, precisa invocar a função connectionFactory, antes não estava dando problema porque nem chegava a executar apenas passava a connection como argumento é parava. Acredito que seja.

Opa Thiago. Coloquei lá da maneira que você falou.

var connection = app.infra.connectionFactory();

O erro parou de aparecer a página também não carrega. Fica num loop infinito. O console continua mostrando: Servidor rodando em localhost:3000.

Aí eu já não sei. Porque as outras rotas, como o produtos/form continuam funcionando.

solução!

o erro esta aqui

produtosDAO.lista(**connection**, function(err, results){})

você esta passando connection como parâmetro porem você não precisa porquê você já passa ela no seu construtor da class

e no seu metodo lista você só precisa de um único parâmetro que é o callback

Na lata Alan!! Era esse mesmo o erro!! Obrigado. Não tinha atentado pra isso, até porque esse é o código do instrutor. Valeu!!