Как я могу перенаправить на URL после загрузки значения переменной? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть приложение в 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();
});

1 Ответ

0 голосов
/ 08 апреля 2020

Вы помещаете перенаправление в обработчик событий end, а также добавляете обработчик ошибок в случае сбоя запроса и меняете имя одного из двух аргументов res, чтобы они не конфликтовали, и вы можете по-прежнему доступ к ним обоим. Я изменил более высокий уровень на response, чтобы его можно было использовать внутри других обратных вызовов, где res уже определено:

//REALIZAR PAGO $
  app.post('/realizarPago', function(req, response){  // <== change arg name to response

  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

    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 += "1234567890";
      response.redirect(307, urlRedirect);      // <== move this here
    });

  });

  req.on('error', err => {                      // <== add this
       console.log(err);
       response.sendStatus(500);
  });

  var postData = qs.stringify({
    'flowOrder': flowOrder,
    'amount': amount,
    ...

   });

   req.write(postData);
   req.end();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...