【问题标题】:How to avoid re-sending data on refresh in Node.js with Express如何避免在 Node.js 中使用 Express 刷新时重新发送数据
【发布时间】:2014-03-07 12:10:32
【问题描述】:

首先,我想为我的英语道歉。

我有一个使用 Express 和 Jade 的 Node.js 应用程序。我的主页有一个表格,允许人们注册。我通过 POST 发送数据。我有一个这样的处理程序:

app.post('/userCreate', user.create);

还有:

exports.create = function(req, res){
  //creates the user in the database
  res.render('./game/main');  //goes to the main game page
}

我的问题是,当人们注册并呈现主页时,URL 中会出现“localhost:3000/userCreate”。因此,如果我按 F5,所有数据都会通过 POST 再次发送,因为它再次捕获“/userCreate”,并尝试创建另一个用户。

我认为一个选项可以在创建用户后更改 URL,但我意识到“渲染”和“重定向”方法都不会改变它。

我一直在阅读有关 post-redirect-get 模式的文章,但我不知道如何在没有表单的情况下进行获取,我的意思是,通过 javascript 而不是 HTML。

【问题讨论】:

  • 你的数据库是什么?我想mongo和mongoose。您可能应该为您的用户添加一个唯一密钥(用于电子邮件或伪...)email: { type : String, index: { unique: true }},
  • 我有一个唯一的密钥。尽管您按 F5,但不会创建用户,因为它是唯一的。但问题是我不想重新发送数据。

标签: javascript node.js express pug


【解决方案1】:

问题出在这里:

res.render('./game/main');  //goes to the main game page

您实际上并没有“转到”主游戏页面,而是为当前 url 呈现该视图。相反,您应该将浏览器重定向到另一条路线:

res.redirect('/game'); // Or whatever url you have

并为该 url 创建一个单独的路由:

app.get('/game', game.index);

并让该路由渲染游戏:

exports.index = function (req, res) {
  res.render('./game/main');
};

现在f5 将重新加载游戏页面而不是 POST 表单。即使您想使用与表单相同的 url,您也应该重定向到相同 url 的 GET-route,以防止重新发布。

【讨论】:

  • 那么,你是说重定向会做得到吗?
  • 是的。当您重定向浏览器时,浏览器 总是 执行 GET。
猜你喜欢
  • 2010-11-21
  • 2015-03-09
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 2020-01-02
  • 1970-01-01
  • 2011-05-10
相关资源
最近更新 更多