2016-01-08 2 views
1

Я использую узел и полосу для обработки платежей. У меня есть настройка маршрута /charge, которая берет кучу параметров с передней стороны и отображает квитанцию.Как предотвратить перезагрузку браузера POST в экспресс?

мне интересно, как я перенаправлять от POST пути к GET маршруту, чтобы предотвратить ошибки, когда кто-то пытается перезагрузить страницу после загрузки POST маршрута?

Это мои маршруты до сих пор. У меня есть кнопка оплаты в /, которая отправляет запрос 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 для сохранения этой новой страницы? Могу ли я перенаправить на домашнюю страницу при обновлении?

Любые советы по этому вопросу будут оценены!

+0

Рассматривали ли вы отправку POST с помощью AJAX? – csum

ответ

1

Это может помочь вам изолировать ваши запросы 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

:)

+1

Другой распространенный способ сохранения данных (включая сообщение об ошибке/успехе) через один переадресацию - использовать куки-файл, который сразу же истекает после следующего успешного запроса. Часто называют флэш-файл cookie: http://stackoverflow.com/a/23161019/511200, хотя я не могу ручаться за любые конкретные реализации Express. – danneu

+0

Отлично. Это то, к чему я стремился! Как сказал @danneu, есть ли способ создать сеанс/файл cookie, который истекает, как только происходит перенаправление? Чтобы сохранить передачу параметров в качестве строки запроса в URL-адресе? – Scotty

+0

@Scotty: Я не использую Express, но, как пример, вот моя незавершенная попытка портировать мое решение Koa для промежуточного ПО Express: https://gist.github.com/danneu/daa2105b1316276974d0 - он не работает с тех пор Я не уверен, как вы можете написать промежуточное ПО Express, которое выполняется после того, как запрос был обработан (но до отправки ответа), поэтому я могу очистить флеш-файл cookie от ответов об успешности, но, возможно, он может помочь осветить, как обычно выполняются флэш-сессии , – danneu

0

Я бы перенаправил их на страницу успеха/сбоя. Запрос POST. Другой вариант - обработать POST с конечной точкой API, которая даст вам больший контроль над страницей, с которой пользователь взаимодействует, чем старомодная форма POST.

+0

Это не то, о чем просит ОП. Кроме того: - $ window.location не существует в узле, что использует OP - OP обрабатывает POST с конечной точкой API, его местоположение равно '/ charge' – Sparkida

Смежные вопросы