2014-03-07 50 views
2

首先,我想爲我的英語道歉。如何避免使用Express在Node.js中重新發送數據

我有一個使用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中出現「本地主機:3000/userCreate」。所以,如果我按F5,所有數據都會通過POST再次發送,因爲它再次捕獲'/ userCreate',並且它會嘗試創建另一個用戶。

我認爲一個選項可以在創建用戶後更改URL,但我意識到'render'和'redirect'方法都不會改變它。

我一直在閱讀關於post-redirect-get模式,但我不知道如何在沒有表單的情況下進行獲取,我的意思是,通過javascript而不是HTML。

+0

什麼是您的數據庫? 我假設mongo與貓鼬。 您應該爲您的用戶添加一個唯一的密鑰(用於電子郵件或僞...)email:{type:String,index:{unique:true}},' – Cyrbil

+0

我有一個唯一的密鑰。雖然您按F5鍵,但用戶不會被創建,因爲它是唯一的。但問題是我不想重發數據。 – Neoares

回答

6

的問題是在這裏:

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路由,以防止重新發布。

+0

那麼,你是說重定向了嗎? – Neoares

+0

是的。當您重定向瀏覽器時,瀏覽器_always_會執行GET。 –

+0

謝謝,它的作品:D – Neoares