如何防止浏览器在 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
:)
我正在使用 node 和 stripe 来处理付款。我有一个 /charge
路由设置,它从前端获取一堆参数并呈现收据。
我想知道如何从 POST
路由重定向到 GET
路由,以防止在加载 POST
路由后有人试图重新加载页面时出现错误?
这些是我到目前为止的路线。我在 /
有一个付款按钮,它向 /charge
.
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
:)