Express.js表单提交

时间:2013-04-03 18:40:45

标签: node.js express

我正在使用Express来提供静态HTML文件profile.html。在文件中,我有一个简单的表单。它曾经有一个文件上传,但为了简单起见,我把它简化为单个文本输入。这是它的样子:

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

当我点击提交按钮时,Chrome会显示提交表单的迹象,但它永远不会发生。提交表单时,我的profile.html的Node.js代码永远不会运行。如果我查看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);

1 个答案:

答案 0 :(得分:1)

您的rawBody中间件和bodyParser的组合不起作用:您的中间件“完全耗尽”req提供的流,而bodyParser会尝试做同样的事。

但是由于流已经被读取并且其end事件已经被触发,bodyParser将无休止地等待一个永远不会发生的end事件(这也解释了为什么请求陷入暂挂状态。)

如果您的中间件不是绝对必要的,请将其留下。如果由于某种原因,您确实需要访问原始主体内容,我不确定是否可以在不重新实现bodyParser的情况下完成。