繁体   English   中英

加载变量值后,如何重定向到 URL?

[英]How can I redirect to URL after variable value is loaded?

我在 Node 中有一个带有 Express 的应用程序,并试图成功完成一个名为“Flow”的支付系统的实施。

[编辑]我绕过了一些非常重要的东西,它是一个 function ,它包装了在方法结束后触发的功能。 我尝试让它异步,这样我就可以将函数包装为 promise,就像有人建议的那样,但出现了一些错误。 我会重新检查。

//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";

我在res.write(postData)执行后尝试了 .then .then() ) ,但没有有用的结果。 我几乎在每种方法中都尝试过.then() ,我也尝试过使用res而不是req ,反之亦然。 我也做了一些研究,发现了一个有趣的东西,称为异步方法的“瀑布”,但在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();
});

您将重定向放入end事件处理程序中,并且您还添加了一个错误处理程序以防请求失败并且您更改了两个res arguments 之一的名称,这样它们就不会发生冲突,您仍然可以访问它们。 我将更高级别的一更改为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();
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM