У меня есть приложение в Node с Express, и я пытаюсь успешно завершить sh внедрение платежной системы под названием «Поток».
[ EDIT ] Я обошел что-то очень важное, это функция, которая оборачивает функциональность, которая срабатывает после завершения метода. Я попытался сделать это asyn c, чтобы потом обернуть функции как обещание, как кто-то посоветовал, но получил некоторые ошибки. Я проверю еще раз.
//REALIZAR PAGO $
app.post('/realizarPago', function(req, res){
var amount = Math.floor(Math.random() * 999999) + 100000;
var paymentMethod = 9;
var urlRedirect = "https://sandbox.flow.cl/app/web/pay.php?token=";
...
//Other relevant variables
var req = https.request(options, function (res) { //<=== This one
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function (chunk) {
...
//this is just a sample token that I'll later capture from response
urlRedirect = urlRedirect+"1234567890";
});
});
var postData = qs.stringify({
'flowOrder': flowOrder,
'amount': amount,
...
});
req.write(postData);
res.redirect(307, urlRedirect);
req.end();
});
Все работает почти нормально, проблема в том, что перенаправление выполняется до того, как urlRedirect обновит свое значение в urlRedirect = urlRedirect+"1234567890";
Я пытался с .then()
после выполнения res.write(postData)
, но безрезультатно. Я пробовал .then()
почти во всех методах, я также пробовал с res
вместо req
и наоборот. Я также провел некоторое исследование и нашел интересную вещь, называемую «водопадом» для асин c методов, но в случае res.on
методы не могут представить способ инкапсуляции этого.
Что я могу попробовать дальше?
[ РЕДАКТИРОВАТЬ 2 ] Благодаря всем вашим указаниям я смог использовать некоторые обещания и изменить порядок исполнения. Теперь он делает то, что мне нужно, теперь он говорит, что в запросе https отсутствуют некоторые параметры. Я должен это исправить. Окончательный код:
//REALIZAR PAGO $
app.post('/realizarPago', async function(request, response){
var amount = Math.floor(Math.random() * 999999) + 100000;
var paymentMethod = 9;
...
//Other relevant variables
var urlRedirect = "https://sandbox.flow.cl/app/web/pay.php?token=";
var req = https.request(options, (res) => {
var chunks = [];
res.on("data", (chunk) => {
chunks.push(chunk);
});
res.on("end", (chunk) => {
var body = Buffer.concat(chunks);
var datos = body.toString();
datos = JSON.parse(datos);
var token = datos.token;
urlRedirect = urlRedirect+token
response.redirect(urlRedirect);
});
});
req.end();
var postData = qs.stringify({
'flowOrder': flowOrder,
'amount': amount,
...
});
req.write(postData);
req.end();
});