javascript - 加载变量值后如何重定向到 URL?
问题描述
我在 Node 中有一个带有 Express 的应用程序,并试图成功完成一个名为“Flow”的支付系统的实施。
[编辑]我绕过了一些非常重要的东西,它是一个包装在方法结束后触发的功能的函数。我试着让它异步,这样我就可以像有人建议的那样将函数包装成一个承诺,但出现了一些错误。我会重新检查。
//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
反之亦然。我也做了一些研究,发现了一个有趣的东西,称为异步方法的“瀑布”,但在方法的情况下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
以便它们不会冲突并且您仍然可以访问它们。我将更高级别的一个更改为,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();
});
推荐阅读
- python - python中的线程在heroku上启动了两次
- node.js - 使用弹性 beantalk 部署应用程序时出现 Pg 库错误
- c++ - 生成一组所有组合
- php - SimpleXML 中的 XPath 变量在 Predecate 中有多个值
- php - 如何在推送通知中添加图标
- shell - 用于文件传输的 Shell 脚本
- laravel - 密码哈希::检查不起作用(SQL + Laravel)
- php - 目标类 [auth.shop] 不存在
- django - 模块“django.core.mail.backends.console”未定义“EmailBacked”属性/类
- audit-logging - Thruk 审核日志