【问题标题】:Express.js Form SubmitExpress.js 表单提交
【发布时间】:2013-03-25 14:13:20
【问题描述】:

我正在使用 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);

【问题讨论】:

  • 您能否包括您的路线在服务器端的外观?

标签: node.js express


【解决方案1】:

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

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

如果您的中间件不是绝对必要的,则将其排除在外。如果出于某种原因,您确实需要访问原始正文内容,我不确定是否可以在不自己重新实现 bodyParser 的情况下完成。

【讨论】:

  • 我不知道我以前怎么没看到。谢谢你。我删除了bodyParser 部分。 rawBody 部分是我唯一真正需要的部分,因为我试图保持与我的 PHP 和 Apache 代码的兼容性。
猜你喜欢
  • 2022-01-26
  • 2021-02-07
  • 2021-05-09
  • 2012-09-14
  • 2018-10-25
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多