如何防止浏览器重新加载邮政路线expression?

我正在使用节点和条纹来处理付款。 我有一个/charge路线设置,从前端的一堆参数,并呈现收据。

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

这些是我的路线到目前为止。 我有一个付款button在/发送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对象都是空的。

处理这个问题的最好方法是什么? redirect到一个新的页面? 我如何获得charge价值坚持到这个新的页面? 我可以redirect到刷新网页?

任何意见,将不胜感激!

它可以帮助你隔离你的GET / POST请求,这样你就不会随身携带POST数据(这会导致你遇到的问题)。 在这里,您可以validation和处理数据,然后将结果作为查询string传递给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

🙂

我会重新引导他们到成功/失败的页面。 POST请求。 另一个select是用一个API端点来处理POST,这个端点可以让你更好地控制用户正在与之交互的页面,而不是一个老式的POST。