javascript - 如何防止浏览器重新加载 Express 中的 POST 路由?

标签 javascript node.js express stripe-payments

我正在使用 Node 和 strip 来处理付款。我有一个 /charge 路由设置,它从前端获取一堆参数并呈现收据。

我想知道如何从 POST 路由重定向到 GET 路由,以防止有人在 POST 之后尝试重新加载页面时出现错误 路线已加载?

这些是我到目前为止的路线。我在 / 处有一个付款按钮,它向 /charge 发送 POST 请求。

router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.post('/charge', function(req, res, next) {

  var stripeToken = req.body.stripeToken;
  var stripeEmail = req.body.stripeEmail;
  var amount = 3999;
  var description = "Product description";

  var charge = stripe.charges.create({
    amount: amount, // amount in cents, again
    currency: "gbp",
    source: stripeToken,
    receipt_email: stripeEmail,
    description: description
  }, function(err, charge) {
    if (err && err.type === 'StripeCardError') {
      // The card has been declined
    } else {
      res.render('charge', {
        title: 'Charge',
        descrption: charge.description,
        total: (charge.amount / 100) + charge.currency.toUpperCase(),
        trans_id: charge.id
      });
    }
  });

});

就我现在而言,/charge 路由错误非常严重,如果提交后重新加载页面,就会破坏应用程序。这是因为 token 仅在第一次尝试时有效,因此此后的所有尝试中 charge 对象均为空。

处理此问题的最佳方法是什么?重定向到新页面?如何让 charge 值保留在这个新页面上?我可以在刷新时重定向到主页吗?

任何对此的建议将不胜感激!

最佳答案

它可以帮助您隔离 GET/POST 请求,这样您就不会携带 POST 数据(这会导致您遇到问题)。您可以在此处验证和处理数据,然后将结果作为查询字符串传递到 GET 路由。

var querystring = require('querystring');

router.post('/charge', function(req, res) {
    var stripeToken = req.body.stripeToken;
    var stripeEmail = req.body.stripeEmail;
    var amount = 3999;
    var description = "Product description";
    if (!stripeToken || !stripeEmail) {
        //do something with error
        res.redirect('/charge-error');
        //or
        res.sendStatus(404);
        return;
    } 
    var charge = stripe.charges.create({
        amount: amount, // amount in cents, again
        currency: "gbp",
        source: stripeToken,
        receipt_email: stripeEmail,
        description: description
    }, function(err, charge) {
        if (err && err.type === 'StripeCardError') {
            // The card has been declined
            res.redirect('/charge-error');
        } else {
            //redirect with result
            res.redirect('/charge?' + querystring.stringify({
                title: 'Charge',
                descrption: charge.description,
                total: (charge.amount / 100) + charge.currency.toUpperCase(),
                trans_id: charge.id                
            });
        }
    });
});


router.get('/charge', function(req, res) {
    //do GET stuff
    res.render('charge', {
        title: req.query.title,
        descrption: req.query.description,
        total: req.query.total,
        trans_id: req.query.trans_id
    });
});

参见:res.redirect(<location>); @http://expressjs.com/en/api.html#res.redirect

:)

关于javascript - 如何防止浏览器重新加载 Express 中的 POST 路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34683277/

相关文章:

javascript - jQuery 仅验证远程 onblur 但允许 onkeyup 休息

node.js - npm 脚本忽略错误

file - 具有文件查询功能的 NodeJS 库

javascript - 脚本。 JADE 标签未在 Express 中呈现

javascript - 您能推荐一些使用 JavaScript 和 jQuery 创建可重用组件的优雅方法吗?

javascript - 使用 jQuery 删除多个文本区域框

javascript - 在 Internet Explorer 8 中动态启用/禁用样式表

javascript - 解析 Node Express 路由中带有特殊字符的 URL

javascript - Express.js : Pass asynchronous errors thrown

javascript - 只允许经过 passportjs 身份验证的用户访问 protected 页面