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

Problemas no código. (

Segue o erro: app.persistencia.PagamentoDao is not constructor

6 respostas

Olá Pablo, tudo bem?

Poderia postar aqui no fórum o código do seu pagamentos.js e do PagamentoDao.js para que a gente possa estar dando uma olhada? :)

Abraços e Bons Estudos!

Código do pagamentos.js:

module.exports = function(app){

    app.get("/pagamentos", function(req, res){
        console.log("Recebida requisição 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 de pagamento eh obrigatorio e deve ser um decimal").notEmpty().isFlot();

        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 requisição 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(erros){
                console.log("Erro ao inserir no banco:" + erros);
                res.status(201).send(erros);
            }else{
                console.log("Pagamento criado");
                res.json(pagamento);
            }
        });
    });
}

Código do PagamentoDao.js:

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

PagamentoDao.prototype.salva = function(pagamento, callback){
    this._connection.query("INSERT INTO pagamentos SET ?", pagamento, callback);
}

PagamentoDao.prototype.lista = function(callback){
    this._connection.query("SELECT * FROM pagamentos", callback);
}

PagamentoDao.prototype.buscaPorId = function(id, callback){
    this._connection.query("SELECT * FROM pagamentos where id = ?",[id], callback);
}

module.exports = function (connection) {
    return PagamentoDao;
}

Olá Pablo,

Que estranho, eu tentei rodar seu código e corrigindo algumas coisas e já funcionou mas não tinha nada muito haver com o construtor do Dao, de qualquer forma pode fazer duas pequenas alterações e testar se funciona?

Primeiro no PagamentoDao.js lá embaixo na module.exports não precisamos passar connection como argumento, pois veja que nem utilizamos :)

Agora algo que pode ter dado erro foi no pagamentos.js, você cometeu um erro de digitação na hora de utilizar o assert:

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

Você colocou isFlot() quando deveria ser isFloat() e isso gera erros ao análisar a requisição

Caso não tenha funcionado me avisa que eu analiso novamente, e ai já posta o código do seu custom-express.js para eu dar uma olhada

Abraços e Bons Estudos!

Fiz essa alteração e o erro ainda persiste: TypeError: app.persistencia.PagamentoDao is not a constructor

Código do custom-express.js:

var express = require("express");
var consign = require("consign");
var bodyParser = require("body-parser");
var expressValidator = require("express-validator");

module.exports = function(){
    var app = express();

    app.use(bodyParser.urlencoded({extended: true}));
    app.use(bodyParser.json());

    app.use(expressValidator());


    consign()
        .include("controllers")
        .then("persistencia")
        .into(app);

    return app;
}

Usei o postman, usando o "pagamento.json":

{
    "forma_de_pagamento":"payfast",
    "valor":10.98,
    "moeda":"BRL",
    "descricao":"criando um pagamento"
}

e voltou o mesmo erro:

TypeError: app.persistencia.PagamentoDao is not a constructor.

Fiz um teste, uma alteração no código no qual eu retirei os códigos do custom-express.js e apenas teve o erro: TypeError: req.assert is not a function.

var expressValidator = require("express-validator");

app.use(expressValidator());
solução!

Olá Pablo, tudo bem?

Está bem estranho esse erro mesmo, pois eu já troquei todos os códigos do professor pelo seu e continuou funcionando normalmente, e já chequei qualquer erro de digitação ou lógica, e não há nenhum fora aquele do flot, você pode fazer mais um teste?

  • Faz o download do projeto do final do capitulo 2: Projeto Capitulo - 2

  • E tente executar normalmente para ver se também persiste o erro

O erro de app.persistencia.PagamentoDao is not a constructor só pode acontecer no arquivo PagamentoDao na hora de exportar a função, porque ai no nosos pagamento.js iriamos querer passar um parâmetro que não existe, entretanto se o seu código está assim:

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

Não era para dar nenhum tipo de erro

Qualquer coisa estou a disposição :)

Abraços e Bons Estudos!

Boa Tarde Pablo,

Acredito que tenha a ver com a ordenação de carregamento dos módulos, tenta alterar o consign assim :

 consign()
        .include("persistencia")
        .then("controllers")
        .into(app);

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