我正在使用 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/