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

Problemas com o método query

Bom dia.

Estou com um problema na execução do método query, conforme erro abaixo.

TypeError: Cannot read property 'query' of undefined
    at PagamentoDao.salva (/Users/ycabral/Desktop/Alura/cursoRestAPI/payfast/persistencia/PagamentoDao.js:6:21)
    at app.post (/Users/ycabral/Desktop/Alura/cursoRestAPI/payfast/controllers/pagamentos.js:32:22)

Quando eu entro com debug (uso vscode), a connection tem um atributo chamado "state" e aparece como "disconnected". Como posso solucionar?

Seguem os fontes:

PagamentoDao.js

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

PagamentoDao.prototype.salva = ( pagamento, callback ) => {
    this._connection.query('INSERT into pagamentos set ?', pagamento, callback);
};

ConnectionFactory.js

var mysql = require('mysql');

function createDBConnection() {
    return mysql.createConnection( {
      host: 'localhost',
      user: 'root',
      password: 'duda@2015',
      database: 'payfast'

    });
};

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

Função post do pagamento.js:

   app.post("/pagamentos/pagamento", ( req, res ) => {
        var pagamento = req.body;

        req.assert("forma_de_pagamento", "Forma de pagamento é obrigatória.").notEmpty();
        req.assert("valor", "Valor é obrigatório e deve ser um decimal.").notEmpty().isFloat();
        req.assert("moeda", "Moeda é obrigatória e deve ter 3 caracteres").notEmpty().len(3,3);

        var errors = req.validationErrors();

        if (errors){
            console.log("Erros de validação encontrados");
            res.status(400).send(errors);
            return;
        }

        console.log('Processando pagamento...');
        res.send('Processando pagamento...');

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

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

        pagamentoDao.salva( pagamento, (exception, result ) => {
            console.log('Pagamento criado: ' + result);
            res.location('/pagamentos/pagamento/' + result.insertId)
            pagamento.id = result.insertId;
            res.send('Pagamento criado: ' + result);
            res.json( pagamento );
        });
    });
};

Segundo o erro, ele parece que não está instanciando a Connection... Pois ele dá como "undefined", mas não consegui achar o erro. Poderiam me ajudar, por favor?

5 respostas

essa linha aqui =>

var connection = app.persistencia.ConnectionFactory();

ta retornando o que? acho que o problema pode estar aí.

Ele retorna uma instância de uma conexão, mas o seu atributo "state" consta como "disconnected".

Já confirmei o login e senha utilizado pra fazer a conexão e ele está correto. Confirmei através do comando

$ mysql -uroot -pduda@2015

e o banco foi acessado com sucesso.

opa yuri, eu não me preocuparia com o status agora, pq o problema parece que estar no fato da sua connection da classe estar undefinded. Como não estou vendo o erro de primeira, acho que a única forma é ir debugando desde o ponto que vc instancia até o ponto que vc usa, para ver onde a gente ta se perdendo.

Então, isso eu também achei estranho, mas debugando está tudo certo quanto a questão da instância...

Se quiser debugar, o meu projeto está no repositório https://github.com/yuric18/alura.

solução!

Após muito tempo pensando e analisando ao código que é disponibilizado no fim da aula, eis o problema:

O uso de Arrow Function no PagamentoDao.js. Removi a Arrow Function e transformei em uma função anônima e o problema foi solucionado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software