6
respostas

app.servicos.CartoesClient is not a constructor

Com relação a aula três, consumindo serviço REST. Estou com a seguinte dificuldade, ao invocar o serviço de pagamento por cartão no arquivo pagamentos.js estoura o seguinte erro:

processando pagamento...
pagamento criado: [object Object]
{ numero: '1234567890123456',
  bandeira: 'VISA',
  ano_de_expiracao: '2020',
  mes_de_expiracao: '12',
  cvv: '12' }
/home/zezinho/Documentos/dev_estudo/payfast/node_modules/mysql/lib/protocol/Parser.js:80
        throw err; // Rethrow non-MySQL errors
        ^

TypeError: app.servicos.CartoesClient is not a constructor
    at Query._callback (/home/zezinho/Documentos/dev_estudo/payfast/controllers/pagamentos.js:85:42)
    at Query.Sequence.end (/home/zezinho/Documentos/dev_estudo/payfast/node_modules/mysql/lib/protocol/sequences/Sequence.js:88:24)
    at Query._handleFinalResultPacket (/home/zezinho/Documentos/dev_estudo/payfast/node_modules/mysql/lib/protocol/sequences/Query.js:139:8)
    at Query.OkPacket (/home/zezinho/Documentos/dev_estudo/payfast/node_modules/mysql/lib/protocol/sequences/Query.js:72:10)
    at Protocol._parsePacket (/home/zezinho/Documentos/dev_estudo/payfast/node_modules/mysql/lib/protocol/Protocol.js:279:23)
    at Parser.write (/home/zezinho/Documentos/dev_estudo/payfast/node_modules/mysql/lib/protocol/Parser.js:76:12)
    at Protocol.write (/home/zezinho/Documentos/dev_estudo/payfast/node_modules/mysql/lib/protocol/Protocol.js:39:16)
    at Socket.<anonymous> (/home/zezinho/Documentos/dev_estudo/payfast/node_modules/mysql/lib/Connection.js:103:28)
    at Socket.emit (events.js:160:13)
    at addChunk (_stream_readable.js:269:12)

Meu arquivo pagamentos.js:

if (pagamento.forma_de_pagamento == 'cartao') {
  var cartao = req.body["cartao"];
  console.log(cartao);
   var clienteCartoes = new app.servicos.CartoesClient;
   clienteCartoes.autoriza(cartao,
      function (exception, request, response, retorno) {
        if (exception) {
           console.log(exception);
           res.status(400).send(exception);
           return;
        }
       console.log(retorno);

       res.location('/pagamentos/pagamento/' + pagamento.id);
       var response = {
        dados_do_pagamanto: pagamento,
        cartao: retorno,
        links: [
          {
            href: "http://localhost:3000/pagamentos/pagamento/" + pagamento.id,
            rel: "confirmar",
            method: "PUT"
         },
        {
            href: "http://localhost:3000/pagamentos/pagamento/" + pagamento.id,
            rel: "cancelar",
            method: "DELETE"
       }
    ]}
   res.status(201).json(response);
   return;

A linha de criação do pagamento

var clienteCartoes = new app.servicos.CartoesClient;

Também já foi testada assim:

var clienteCartoes = new app.servicos.CartoesClient();

O clienteCartoes.js se enncontra assim:

var clients = require('restify-clients');

function CartoesClient() {
  this._client = clients.createJsonClient({
    url: 'http://localhost:3001',
    version: '~1.0'
  });
}

CartoesClient.prototype.autoriza = function(cartao, callback) {
  this._client.post('/cartoes/autoriza', cartao, callback);
}

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

A linha do module exports já foi testada também da seguinte forma:

module.exports = CartoesClient;

Alguma idéia do de que está acontecendo?

6 respostas

Olá, Wllyssys.

Eu não achei nenhum erro no seu código. Sobre a forma correta de realizar o module.exports, você comendou sobre duas a primeira é a correta:

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

Acho que você está usando o express-laod, se sim, por favor adicione a parte do código que você usa o express-load?

No curso estamos usando o consign:

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());

    //Obrigatoriamente logo apos o bodyParser
    app.use(expressValidator()); 


    consign()
    .include('controllers')
    .then('persistencia')
    .then('servicos')
    .into(app);

    return app;
}

Estou começando a suspeitar que pode ser este consign.

Wllyssys. Como está a estrutara de pasta e arquivos dentro da pasta servicos?

Faltou informar ao cosign o cwd

consign({cwd: 'app'})
    .include('controllers')
    .then('persistencia')
    .then('servicos')
    .into(app);

A estrutura de pastas é a seguinte:

.:
config
controllers
index.js
node_modules
package.json
persistencia
README.md
servicos
yarn.lock

./config:
custom-express.js

./controllers:
pagamentos.js

./persistencia:
connectionFactory.js
PagamentoDao.js

./servicos:
clienteCartoes.js

Bruno a ideia foi boa adicionei o seguinte, mas não obtiive sucesso:

consign({cwd: 'app'})
    .include('controllers')
    .then('persistencia')
    .then('servicos')
    .into(app);

Log:

consign v0.1.6 Initialized in app
! Entity not found /home/ulima/Documentos/dev_estudo/payfast/app/controllers
! Entity not found /home/ulima/Documentos/dev_estudo/payfast/app/persistencia
! Entity not found /home/ulima/Documentos/dev_estudo/payfast/app/servicos

Então troquei para:

consign({cwd: './'})
    .include('controllers')
    .then('persistencia')
    .then('servicos')
    .into(app);

Mas aí surge outro erro:

TypeError: Cannot read property 'connectionFactory' of undefined
    at /home/ulima/Documentos/dev_estudo/payfast/controllers/pagamentos.js:72:47

Ah! Acho que é o nome do seus arquivos que estão errado. Troca o nome do arquivo clienteCartoes.js por ClienteCartoes.js. Depois me diz se funciona de boas :-)