【问题标题】:Node.js Express: Redirect or render on postNode.js Express:在帖子中重定向或呈现
【发布时间】:2023-03-20 10:53:02
【问题描述】:

我有一个类似这样的发布路线:

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

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

【问题讨论】:

标签: javascript node.js post routing


【解决方案1】:

这两个选项都定期进行。选择重定向而不是渲染的原因纯粹是基于您希望在发布后发生的事情。

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

如果这是来自浏览器网页的表单提交,并且您希望浏览器中的 URL 以与呈现的内容相匹配的方式结束,那么重定向非常有意义。

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

【讨论】:

    【解决方案2】:

    虽然您可以使用这两种方法,但查看上述情况,您不需要先执行res.redirect(),然后再执行res.render(),您可以直接从第一条路线本身执行res.render()

    res.redirect() 将很有用,如果您有可以直接点击或通过重定向点击的路线,这样您就不必在两个地方再次实现相同的逻辑。

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 2014-07-31
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多