如何防止浏览器在 express 中重新加载 POST 路由?

How do i prevent the browser reloading a POST route in express?

我正在使用 node 和 stripe 来处理付款。我有一个 /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 路由错误非常严重,如果页面在提交后重新加载,应用程序就会中断。这是因为令牌仅在第一次尝试时有效,因此 charge 对象在此之后的所有尝试中都是空的。

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

如有任何建议,我们将不胜感激!

我会 re-direct 他们到 success/failure 页面。 POST 请求。另一种选择是使用 API 端点处理 POST ,与 old-fashioned 表单 POST.

它可以帮助您隔离 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

:)