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

Problema ao enviar exception para o client

Olá,

A minha exception está sendo retornada de forma diferente no console da API, além de ir vazia para o cliente (estou usando o postman). O que vcs acham que está ocorrendo? Pode ser a lib nova restify-clients?

pagamentos.js

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

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

        var erros = req.validationErrors();

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

        var pagamento = req.body["pagamento"];
        console.log(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');

                pagamento.id = resultado.insertId;

                if(pagamento.forma_de_pagamento == 'cartao'){

                    var cartao = req.body['cartao'];
                    console.log(cartao);

                    var clienteCartoes = new app.servicos.clienteCartoes();
                    clienteCartoes.autoriza(cartao, function(exception, request, response, retorno){
                    //cuidado com o nome dos parametros, nao pode ser igual aos no começo da rota

                        if(exception){
                            console.log(exception);
                            res.status(400).send(exception);
                            return;
                        }

                        console.log(retorno);
                        res.status(201).send(retorno);
                        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);
                }                
            }
        });
    });

//...

clienteCartoes.js

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

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

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

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

O retorno no console na API:

{ forma_de_pagamento: 'cartao',
  valor: '10.87',
  moeda: 'BRL',
  descricao: 'descrição do pagamento' }
pagamento criado
{ numero: 12341234123412,
  bandeira: 'visa',
  ano_de_expiracao: 2016,
  mes_de_expiracao: 12,
  cvv: 123 }
{ BadRequestError: [{"param":"numero","msg":"Número é obrigatório e deve ter 16 caracteres.","value":12341234123412}]
    at Object.createHttpErr (C:\Users\Arthur\Dropbox\Alura\Desenvolvedor NodeJs\Node.js e HTTP - Desenvolvendo uma API seguindo o estilo REST\payfast\node_modules\restify-clients\lib\helpers\errors.js:91:26)
    at ClientRequest.onResponse (C:\Users\Arthur\Dropbox\Alura\Desenvolvedor NodeJs\Node.js e HTTP - Desenvolvendo uma API seguindo o estilo REST\payfast\node_modules\restify-clients\lib\HttpClient.js:207:26)
    at Object.onceWrapper (events.js:315:30)
    at emitOne (events.js:116:13)
    at ClientRequest.emit (events.js:211:7)
    at HTTPParser.parserOnIncomingClient (_http_client.js:551:21)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:117:23)
    at Socket.socketOnData (_http_client.js:440:20)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211:7)
  jse_shortmsg: '',
  jse_info:
   { address: '127.0.0.1',
     fullUrl: 'http://localhost:3001/cartoes/autoriza',
     method: 'POST',
     port: '3001' },
  message: '[{"param":"numero","msg":"Número é obrigatório e deve ter 16 caracteres.","value":12341234123412}]',
  body:
   [ { param: 'numero',
       msg: 'Número é obrigatório e deve ter 16 caracteres.',
       value: 12341234123412 } ] }

Retorno no postman:

{}

Headers no postman:

connection →keep-alive
content-length →2
content-type →application/json; charset=utf-8
date →Tue, 13 Mar 2018 21:47:50 GMT
etag →W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-powered-by →Express
solução!

Só um update: Instalei a lib do restify@4.1.1 (a usada no vídeo), e funcionou normalmente. Imagino que seja a maneira nova do restify de lidar com os erros.

Tentei o que disse, e mesmo assim não funcionou, alguém poderia dar uma ajuda ??

Tente utilizar desta maneira, o retorno mudou, acredito que devido as versões da lib restify-clients

res.status(400).send(exception['message'])