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

Arquivo para isolar a comunicação com o banco

Integrei a minha aplicação com Postgres usando o 'pg' e até o momento do isolamento do código do banco estava funcionando normalmente fazendo a query diretamente na rota, mas depois que isolei, o retorno da query parece não voltar do produtoBanco.js para a minha rota produto.js Não sei o que estou fazendo de errado.

produtos.js

module.exports = function(app){
    app.get("/produtos",function(req,res){
          //res.render("produtos/lista");

        var client = app.infra.connectionFactory();

        var produtosBanco = app.infra.produtosBanco;

        produtosBanco.lista(client, function (err, result){
            console.log(result);
            //res.send(result);
              res.render("produtos/lista",{lista:result.rows});
         });


    });
};

produtosBanco.js

module.exports =  function(){
    this.lista = function(client, callback){


        client.connect(function (err) {
                if (err) {
                return console.error('error fetching client from pool', err);
               }
              client.query('SELECT * FROM livros',  function(err, result) {
                if (err) {
                  return console.error('error running query', err);
                }
                console.log(result.rows[0].id);
              });
        });



    }

    return this;
}
5 respostas

Em nenhum momento da função lista vc chama o callback que foi passado como argumento... Vc deveria chamar o callback passando o erro e o resultado.

A única forma que consegui para que ele retornasse o valor para a rota foi a seguinte :

produtosBanco.js

module.exports =  function(){
    return function(connection){
        this.lista = function(callback){
            //connection.query('SELECT * FROM livros',  callback);
            connection.connect(function (err) {
                    if (err) {
                    return console.error('error fetching client from pool', err);
                   }
                  return connection.query('SELECT * FROM livros',  function(err, result) {
                    if (err) {
                      return console.error('error running query', err);
                    }

                    callback(err, result.rows);
                  });
            });
        }
        return this;
    }
}

produtos.js

module.exports = function(app){
    app.get("/produtos",function(req,res){
        var client = app.infra.connectionFactory();
        var produtosBanco = app.infra.produtosBanco(client);
        produtosBanco.lista(function (err, result){
              res.render("produtos/lista",{lista:result});
         });
        client.end();
    });
};

Eu tentei no produtoBanco.js fazer da mesma forma que a citada, passando apenas o callback sem os parâmetros:

connection.query('SELECT * FROM livros',  callback);

substituindo todo o corpo do método lista, porém o servidor não retornava.

Acho que me expressei mal, era algo parecido com o que vc fez..

module.exports =  function(){
    return function(connection){
        this.lista = function(callback){
            //connection.query('SELECT * FROM livros',  callback);
            connection.connect(function (err) {
                    if (err) {
            callback(err);
                   }
                  return connection.query('SELECT * FROM livros',  function(err, result) {
                    callback(err, result.rows);
                  });
            });
        }
        return this;
    }
}
solução!

Emerson,

é exatamente isso que você fez. O objeto result do driver do postgres funciona de forma diferente do driver do mysql.

Também implementei meu exemplo usando o postgres e segue abaixo minhas implementações pra você comparar.

Arquivo /app/infra/connectionFactory.js

var pg = require('pg');

function createDBConnection(){
    var client = new pg.Client({
        user: 'postgres',
        password: 'masterkey',
        database: 'casadocodigo',
        host: 'localhost',
        port: 5432,
        application_name: 'Casa_do_Codigo'
    });

    client.on('drain', client.end.bind(client)); //disconnect client when all queries are finished

    return client;

}

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

Arquivo /app/infra/produtosDAO.js

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

ProdutosDAO.prototype.lista = function(callback){
    this._connection.connect();

    //query is executed once connection is established and
    //PostgreSQL server is ready for a query
    this._connection.query("SELECT * FROM livros ORDER BY titulo", function(err, result) {
        if(err){
            console.log("Erro na consulta: " + err);
        } else {
            //res.send(result.rows);
            console.log('DAO - Total registros: ' + result.rowCount);
        }
        return callback(err, result);
    });
}

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

Arquivo /app/routes/route-produtos.js

//var connectionFactory = require('../infra/connectionFactory');

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, result){
            res.render("produtos/lista.ejs", {livros : result.rows});
        });
    });
}

Obrigado Fabio, da forma como você implementou ficou mais clara que a minha pois estava abrindo a conexão e fechando diretamente na minha rota!