Node.js Express:在帖子上重定向或呈现

时间:2016-08-31 07:46:11

标签: javascript node.js post routing

我的帖子看起来像这样:

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');
});

这是要走的路吗?或者有更好的方法来做到这一点吗?

2 个答案:

答案 0 :(得分:1)

这两个选项都是定期完成的。在渲染上选择重定向的原因完全基于您希望在帖子后发生的内容。

如果这是一个由某个外部脚本(通过Ajax或任何外部代理的Javascript)调用的API,那么您应该只呈现一个可接受的(可能很小的)响应,通常是一个简单的JSON。

如果这是来自浏览器网页的表单提交,并且您希望浏览器中的URL最终得到与呈现内容匹配的内容,则重定向非常有意义。

如果这是表单提交,则任一选项都会从浏览器中清除表单,并阻止重新发布相同数据。

答案 1 :(得分:1)

虽然你可以使用这两种方法但是看看上面的情况,你不需要res.redirect()然后res.render()你可以直接从第一条路线本身做res.render()

如果你有直接命中或通过重定向的路线,

res.redirect()会很有用,这样你就不会在两个地方再次实现相同的逻辑。