Boa tarde, pessoal
Como dito em meu ultimo post, estou utilizando o projeto desta aula como base para fazer minha própria API de pagamentos (estou trabalhando em uma start-up de meios de pagamento) e encontrei alguns problemas ao ir adiante com o desenvolvimento da solução. Sendo mais específico, meus problemas são as orientações a callback do Js e do NodeJs.
Vamos ao código:
transactionProcessor.prototype.transaction = function (paymentRequest, callback) {
var err, finalResponse;
err = finalResponse = null;
console.log("============= TRANSACTION =============");
this._authorize(paymentRequest, function (error, authResponse) {
if (error) {
//TODO: format the error here
err = error;
return;
}
if (authResponse.status !== "success") {
//TODO: return that the authorization wasn't approved
finalResponse = authResponse;
return;
}
});
console.log("============= TRANSACTION =============");
callback(err, finalResponse);
};
transactionProcessor.prototype._authorize = function (clientRequest, callback) {
console.log("============= AUTHORIZE =============");
var formattedRequest = this._transformRequest(clientRequest, this._requestTypes.AUTHORIZATION);
var reqOptions = {
url: this._requestUrls.transaction,
body: formattedRequest,
headers: {'Content-Type': 'text/xml'}
};
var formattedError, serverResponse;
formattedError = serverResponse = null;
this._makeRequest(reqOptions, function (err, finalResponse) {
if (err) {
//TODO: format your error here
formattedError = err;
return;
}
serverResponse = finalResponse;
});
console.log("============= AUTHORIZE =============");
callback(formattedError, serverResponse);
};
transactionProcessor.prototype._makeRequest = function (options, callback) {
var err, finalResponse;
err = finalResponse = null;
console.log("============= MakeREQUEST =============");
request.post(options, function (error, response, responseBody) {
console.log("============= REQUEST LIB =============");
console.log("Error: " + JSON.stringify(error));
console.log("Response: " + JSON.stringify(response));
console.log("Body: " + JSON.stringify(responseBody));
if (error) {
err = error;
console.log("Error: " + JSON.stringify(error));
return;
}
if (response.statusCode !== 200) {
console.log("Response != 200: " + JSON.stringify(response));
return;
}
finalResponse = responseBody;
console.log("MaxxiPago Response: " + finalResponse);
console.log("============= REQUEST LIB =============");
});
console.log("Err: " + err);
console.log("finalResponse: " + finalResponse);
console.log("============= MakeREQUEST =============");
callback(err, finalResponse);
};
Como podemos ver acima, temos 3 funções que são:
transaction: esta é a função principal, fará todo o fluxo da transação como autorização (verificação de dados válidos), captura (se autorização não deu erro, faz a captura e aprova), guardar a transação (mysql) e enviar a resposta ao cliente.
_authorize: essa é a função responsável pela autorização dita acima, tem como objetivo pegar a requisição do cliente e transformar em uma requisição no formato que espera o processador de transação e retornar a resposta do mesmo
_makeRequest: essa é a função que realmente utiliza a lib request. Criei essa função com o intuito de não repetir código pois todas as requisições ao processador de transações (transação, estorno, recorrência, etc) são da mesma forma, mudando somente o corpo da requisição.
Dado o contexto, aqui vai o meu problema: Como podemos ver, a função makeRequest possui o callback para a função post da lib request. Até aí tudo bem, só que o problema é que as variáveis err e finalResponse (declaradas no começo como null para receberem valor dentro do callback da request) continuam sendo retornadas como null porquê a ordem de execução do node em relação a callbacks é assíncrona e o callback é executado depois da função que o chama.
Porém, eu necessito que aquelas variáveis sejam preenchidas.Pois se não forem, serão retornadas nulas as funções authorize e transaction e acabará dando erro como "Cannot read property 'status' of null (na função transaction)".
Obs: - Estou utilizando callback na função makeRequest e na Authorize porque foi a melhor maneira que encontrei de retornar as informações como err e responseBody. Há uma maneira melhor de se fazer isso?
Qual a resolução disso?
Atenciosamente, Caio Salgado Nepomuceno