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

conectando o nodejs com postgres

Amigo, bom dia.

Estou tentando ainda conectar com o banco de dados postgres porem sem sucesso.

meu connectionFactory esta assim:

var pg  = require('pg');

function createDBConnection(){
        return pg.createConnection({
            host: 'localhost', 
            port: 5432,
            database: 'testeapi',
            user: 'postgres',
            password: 'cancel12'
        });
}

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

O meu pagamentos.js esta assim:

module.exports = function(app){
  app.get('/pagamentos', function(req, res){
    console.log('Recebida requisicao de teste na porta 3000.')
    res.send('OK.');
  });

  app.post('/pagamentos/pagamento', function(req, res){

    req.assert("forma_de_pagamento",
        "Forma de pagamento eh obrigatorio").notEmpty();
    req.assert("valor",
      "Valor eh obrigatorio e deve ser um decimal")
        .notEmpty().isFloat();

    var erros = req.validationErrors();

    if (erros){
      console.log('Erros de validacao encontrados');
      res.status(400).send(erros);
      return;
    }

    var pagamento = req.body;
    console.log('processando uma requisicao de um novo pagamento');

    pagamento.status = 'CRIADO';
    pagamento.data = new Date;

    var connection = app.persistencia.connectionFactory();
    var pagamentoDao = new app.persistencia.PagamentoDao(connection);

    pagamentoDao.salva(pagamento, function(erro, resultado){
      if(erro){
        console.log('Erro ao inserir no banco:' + erro);
        res.status(500).send(erro);
      } else {
      console.log('pagamento criado');
      res.location('/pagamentos/pagamento/' +
            resultado.insertId);

      res.status(201).json(pagamento);
    }
    });

  });
}

Porem esta dando o seguinte erro:

module.exports = function(app){
  app.get('/pagamentos', function(req, res){
    console.log('Recebida requisicao de teste na porta 3000.')
    res.send('OK.');
  });

  app.post('/pagamentos/pagamento', function(req, res){

    req.assert("forma_de_pagamento",
        "Forma de pagamento eh obrigatorio").notEmpty();
    req.assert("valor",
      "Valor eh obrigatorio e deve ser um decimal")
        .notEmpty().isFloat();

    var erros = req.validationErrors();

    if (erros){
      console.log('Erros de validacao encontrados');
      res.status(400).send(erros);
      return;
    }

    var pagamento = req.body;
    console.log('processando uma requisicao de um novo pagamento');

    pagamento.status = 'CRIADO';
    pagamento.data = new Date;

    var connection = app.persistencia.connectionFactory();
    var pagamentoDao = new app.persistencia.PagamentoDao(connection);

    pagamentoDao.salva(pagamento, function(erro, resultado){
      if(erro){
        console.log('Erro ao inserir no banco:' + erro);
        res.status(500).send(erro);
      } else {
      console.log('pagamento criado');
      res.location('/pagamentos/pagamento/' +
            resultado.insertId);

      res.status(201).json(pagamento);
    }
    });

  });
}

Ja tentei de tudo e nada resolveu.

Teria como me ajudar a identificar o erro?

Obrigado

4 respostas

Corrigindo o erro retornado é:

processando uma requisicao de um novo pagamento
TypeError: pg.createConnection is not a function
    at Object.createDBConnection [as connectionFactory] (C:\Users\Ronald\Desktop\conciliador api\persistencia\connectionFactory.js:4:13)
    at C:\Users\Ronald\Desktop\conciliador api\controllers\pagamentos.js:29:39
    at Layer.handle [as handle_request] (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\route.js:131:13)
    at Route.dispatch (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:277:22
    at Function.process_params (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:330:12)
    at next (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:271:10)
    at C:\Users\Ronald\Desktop\conciliador api\node_modules\express-validator\lib\express_validator.js:291:5
    at Layer.handle [as handle_request] (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:312:13)
    at C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:280:7
    at Function.process_params (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:330:12)
    at next (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:271:10)
    at jsonParser (C:\Users\Ronald\Desktop\conciliador api\node_modules\body-parser\lib\types\json.js:94:7)

Oi Renan, o que acontece é que você está exportando uma função que exporta outra função, mas sem executar, por isso você quando importa executando, somente a primeira função é chamada, mas a segunda não. Essa é a linha:

var connection = app.persistencia.connectionFactory()

Neste caso, você está executando a função que foi exportada, que retorna a função de criação da conexão, mas sem executá-la, pra resolver, é só adicionar mais uma dupla de parênteses.

var connection = app.persistencia.connectionFactory()();

Deu pra entender? Pode ter ficado confuso.

Wnderson,

Eu tentei fazer isso tambem como ensinado no curso porem ainda retorna o mesmo erro:

Servidor rodando na porta 3000.
processando uma requisicao de um novo pagamento
TypeError: pg.createConnection is not a function
    at Object.createDBConnection [as connectionFactory] (C:\Users\Ronald\Desktop\conciliador api\persistencia\connectionFactory.js:4:13)
    at C:\Users\Ronald\Desktop\conciliador api\controllers\pagamentos.js:29:39
    at Layer.handle [as handle_request] (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\route.js:131:13)
    at Route.dispatch (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:277:22
    at Function.process_params (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:330:12)
    at next (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:271:10)
    at C:\Users\Ronald\Desktop\conciliador api\node_modules\express-validator\lib\express_validator.js:291:5
    at Layer.handle [as handle_request] (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:312:13)
    at C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:280:7
    at Function.process_params (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:330:12)
    at next (C:\Users\Ronald\Desktop\conciliador api\node_modules\express\lib\router\index.js:271:10)
solução!

Oi Renan, agora vendo direito, me parece que você está tentando executar a mesma função de conexão do MySQL no Postgre, são bancos diferentes, protocolos diferentes, pacotes diferentes e as funções são outras.

Veja os exemplos na documentação de como criar a conexão: https://node-postgres.com/features/connecting