Perdi um bom tempo tentando entender o que estava dando errado no meu código e percebi que dessa forma:
pagamentos.js
if(pagamento.forma_de_pagamento == "cartao"){
const cartao = req.body["cartao"];
const serviceCartoes = new app.servicos.cartoesClient();
serviceCartoes.autoriza(cartao, (exception, request, response, data) => {
if(exception) {
console.log(exception);
resp.status(400).send(exception);
return;
}
const res = {
dados_de_pagamento : pagamento,
cartao : data,
links : [
{
href : "http://localhost:3000/pagamentos/pagamento/"+pagamento.id,
rel : PAGAMENTO_CONFIRMADO,
method : "PUT"
},
{
href : "http://localhost:3000/pagamentos/pagamento/"+pagamento.id,
rel : PAGAMENTO_CANCELADO,
method : "DELETE"
}
]
};
resp.location("/pagamentos/pagamento/"+ pagamento.id);
resp.status(201).json(res);
});
return;
}
Consigo fazer funcionar, porém eu deixo a conexão do banco aberta.
Porém quando eu coloco o connection.end(), ele me retorna um erro:
if(pagamento.forma_de_pagamento == "cartao"){
const cartao = req.body["cartao"];
const serviceCartoes = new app.servicos.cartoesClient();
serviceCartoes.autoriza(cartao, (exception, request, response, data) => {
if(exception) {
console.log(exception);
resp.status(400).send(exception);
return;
}
const res = {
dados_de_pagamento : pagamento,
cartao : data,
links : [
{
href : "http://localhost:3000/pagamentos/pagamento/"+pagamento.id,
rel : PAGAMENTO_CONFIRMADO,
method : "PUT"
},
{
href : "http://localhost:3000/pagamentos/pagamento/"+pagamento.id,
rel : PAGAMENTO_CANCELADO,
method : "DELETE"
}
]
};
resp.location("/pagamentos/pagamento/"+ pagamento.id);
resp.status(201).json(res);
});
connection.end();
return;
}
Consumindo API cartoes/autoriza
events.js:183
throw er; // Unhandled 'error' event
^
Error: Cannot enqueue Quit after invoking quit.
Eu imagino que tenha alguma coisa á ver com o callback assíncrono do NodeJS. Porém eu não entendi direito como funciona essa função assíncrona. Só vai executar o callback quando a API externa retornar o cartão? E por isso da erro por que ele segue para o próximo statement que é connection.end()?