2013-04-03 104 views
3

我使用Express將靜態HTML文件服務器profile.html。在文件中,我有一個簡單的表單。它曾經有一個文件上傳,但爲簡單起見,我已將其縮減爲只有一個文本輸入。這是它的樣子:Express.js表單提交

<form action="profile.html" method="post" id="foo" enctype="multipart/form-data"> 
    <input type="text" name="foo" value="bar"> 
    <input type="submit"> 
</form> 

當我點擊提交按鈕時,Chrome顯示提交表單的跡象,但它從來沒有發生過。提交表單時從不運行我的Node.js代碼profile.html。如果我查看Chrome開發人員工具的網絡標籤,則會顯示該請求仍處於待處理狀態。當使用PHP和Apache時,這是完美的,但在使用Node.js和Express時會失敗。

我看了無數的例子,但我覺得這必須是配置問題,而不是代碼問題。什麼可能阻止表單提交給我的服務?

編輯:這裏是大致也是我的路線是:

//modules, initialization, etc. 
var app = express(); 

app.use(function(req, res, next) { 
    var data = ""; 
    req.setEncoding("utf8"); 
    req.on("data", function(chunk) { 
     data += chunk; 
    }); 
    req.on("end", function() { 
     req.rawBody = data; 
     next(); 
    }); 
}); 
app.use(express.bodyParser()); 

//Server up our templated static HTML 
app.use("/search.html", search_html.handler); 
app.use("/app.html", app_html.handler); 
app.use("/login.html", login_html.handler); 
app.use("/graph", graph_page.handler); 
app.use("/dbrequest", dbrequest_page.handler); 
app.use("/profile.html", profile_html.handler); 

app.use("/", function(request, response) { 
    response.redirect("login.html"); 
}); 
app.listen(3000); 
+0

你可以包括你的路線在服務器端看起來如何? – 2013-04-03 19:05:04

回答

1

rawBody中間件和bodyParser的組合行不通的:您的中間件「排出」由req完全提供的數據流,並bodyParser會嘗試做同樣的事情。

但由於流已經閱讀並已經引發了end事件,bodyParser會無休止地等待end事件永遠不會發生(這也解釋了爲什麼請求被卡在待定狀態)。

如果您的中間件不是絕對必要的,就把它放在外面。如果出於某種原因,您確實需要訪問原始內容,我不確定是否可以在不重新實施bodyParser的情況下完成。

+0

我不知道我以前怎麼沒有看到。謝謝。我刪除了'bodyParser'部分。 'rawBody'部分是我真正需要的唯一部分,因爲我試圖保持與我的PHP和Apache代碼的兼容性。 – GJK 2013-04-03 21:46:18