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

Crash no Nodemon do payfast após acessar a API como Cliente

Após enviar a requisição curl com um pagamento de cartão, o meu cmd responde como esperado, mas o nodemon do payfast dá um erro de HTTP, conforme segue (usei a versão do restify do curso):

1) Requisição e Retorno no cmd: C:\Users\Pantufa\payfast>curl http://localhost:3000/pagamentos/pagamento -X POST -v -H "Content-type: application/json" -d @pagamento.json Note: Unnecessary use of -X or --request, POST is already inferred.

  • Trying ::1...
  • TCP_NODELAY set
  • Connected to localhost (::1) port 3000 (#0)

    POST /pagamentos/pagamento HTTP/1.1 Host: localhost:3000 User-Agent: curl/7.63.0 Accept: / Content-type: application/json Content-Length: 298

  • upload completely sent off: 298 out of 298 bytes < HTTP/1.1 201 Created < X-Powered-By: Express < Content-Type: application/json; charset=utf-8 < Content-Length: 101 < ETag: W/"65-ww47io0UpeCwAJjWx4HATdU9utw" < Date: Sat, 29 Dec 2018 00:49:30 GMT < Connection: keep-alive < {"numero":1234123412341234,"bandeira":"visa","ano_de_expiracao":2016,"mes_de_exp iracao":12,"cvv":123}* Connection #0 to host localhost left intact

3) erro no nodemon: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the cli ent at ServerResponse.setHeader (httpoutgoing.js:470:11) at ServerResponse.header (C:\Users\Pantufa\payfast\node_modules\express\libresponse.js:767:10) at ServerResponse.location (C:\Users\Pantufa\payfast\node_modules\express\li b\response.js:884:15) at C:\Users\Pantufa\payfast\controllers\pagamentos.js:124:19 at parseResponse (C:\Users\Pantufa\payfast\node_modules\restify\lib\c lients\string_client.js:165:13) at Object.onceWrapper (events.js:273:13) at IncomingMessage.emit (events.js:187:15) at endReadableNT (streamreadable.js:1094:12) at process.tickCallback (internal/process/nexttick.js:63:19) [nodemon] app crashed - waiting for file changes before starting...

`

3 respostas

Segue o trecho do meu pagamentos.js

 //REQUISIÇÕES POST
    app.post("/pagamentos/pagamento",function(req, res) {

    //VALIDAÇÕES DOS CAMPOS NO JSON - PARA ENVIO AO BD
      req.assert("pagamento.forma_de_pagamento", "Forma de pagamento eh obrigatoria").notEmpty();
      req.assert("pagamento.valor", "Valor eh obrigatorio e deve ser decimal").notEmpty().isFloat();
      req.assert("pagamento.moeda", "Moeda é obrigatória e deve ter 3 caracteres").notEmpty().len(3,3);

      var erros = req.validationErrors();


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

    //INICIO REQUISIÇÃO POST
    //CRIA VARIÁVEIS CONEXÃO, PAGAMENTODAO, FAZ REQUISIÇÃO AO BODY DA API (BUSCA DADOS)

      var pagamento = req.body["pagamento"];
      console.log('processando pagamento...');

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

    //INCLUI DADOS AOS RECEBIDOS DO BODY

      pagamento.status = PAGAMENTO_CRIADO;
      pagamento.data = new Date;


    //UTILIZA PAGAMENTODAO PARA SALVAR DADOS NO BD

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

              pagamento.id = resultado.insertId
              console.log('pagamento criado: ' + resultado);

              //VERIFICA SE PAGAMENTO VIA CARTÃO
          if(pagamento.forma_de_pagamento == 'cartao'){
                  var cartao = req.body["cartao"];
                  console.log(cartao);

            //UTILIZA API DE CARTÕES
            var clienteCartoes = new app.servicos.clienteCartoes();

            clienteCartoes.autoriza(cartao, function(error, request, response, retorno){
              if (error){
                console.log(error);
                res.status(400).send(error);
                return;
              }
              console.log(retorno);

              res.location('/pagamentos/pagamento/' +pagamento.id);

              var response = {
                dados_do_pagamento: 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(retorno);
              return;

            });

                  res.status(201).json(cartao)
                  return;

            } else{

                res.location('pagamentos/pagamento/' + pagamento.id);

                var response = {
                    dados_do_pagamento: pagamento,
                    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);

            }
        }

      });
    });

}
solução!

Oi Clarisse tudo certo ?

Acredito que isso esteja acontecendo porque estamos fazendo o retorno duas vezes.

Esse retorno depois do else não exite.

                  res.status(201).json(cartao)
                  return;

            } else{

Outra coisa que reparei, nesse trecho PAGAMENTO_CRIADO teria que ser uma string certo

pagamento.status = 'PAGAMENTO_CRIADO';

deu certinho, obrigada...

quanto ao trecho do status de pagamento, não é uma string pq segui um dos exercícios e criei variáveis para os status:

 const PAGAMENTO_CRIADO = "CRIADO";
      const PAGAMENTO_CONFIRMADO = "CONFIRMADO";
      const PAGAMENTO_CANCELADO = "CANCELADO";