我的帖子看起来像这样:
router.post('/:name/book', function(req, res){
Booking.create(myNewBooking, function(err, booking){
if(err){ return next(err); }
//What am I supposed to do here? I usually do:
req.app.locals.booking = booking;
res.render('booking_success.jade');
});
});
问题:如果用户在执行此发布请求后刷新,则会再次发送相同的数据。我不希望那是可能的。防止这种情况的最佳方法是什么?我想到了这个:
router.post('/:name/book', function(req, res){
Booking.create(myNewBooking, function(err, booking){
if(err){ return next(err); }
res.redirect('/booking-success');
});
});
router.get('/booking-success', function(req, res){
res.render('booking_success.jade');
});
这是要走的路吗?或者有更好的方法来做到这一点吗?
答案 0 :(得分:1)
这两个选项都是定期完成的。在渲染上选择重定向的原因完全基于您希望在帖子后发生的内容。
如果这是一个由某个外部脚本(通过Ajax或任何外部代理的Javascript)调用的API,那么您应该只呈现一个可接受的(可能很小的)响应,通常是一个简单的JSON。
如果这是来自浏览器网页的表单提交,并且您希望浏览器中的URL最终得到与呈现内容匹配的内容,则重定向非常有意义。
如果这是表单提交,则任一选项都会从浏览器中清除表单,并阻止重新发布相同数据。
答案 1 :(得分:1)
虽然你可以使用这两种方法但是看看上面的情况,你不需要res.redirect()
然后res.render()
你可以直接从第一条路线本身做res.render()
。
res.redirect()
会很有用,这样你就不会在两个地方再次实现相同的逻辑。