如何在 Express 中访问 POST 表单字段

新手上路,请多包涵

这是我的简单表格:

<form id="loginformA" action="userlogin" method="post">
    <div>
        <label for="email">Email: </label>
        <input type="text" id="email" name="email"></input>
    </div>
<input type="submit" value="Submit"></input>
</form>

这是我的 Express.js /Node.js 代码:

app.post('/userlogin', function(sReq, sRes){
    var email = sReq.query.email.;
}

我尝试 sReq.query.emailsReq.query['email']sReq.params['email'] 等。它们都不起作用。他们都返回 undefined

当我更改为 Get 调用时,它可以工作,所以..有什么想法吗?

原文由 murvinlai 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 790
2 个回答

Express 4.16.0 开始,情况再次发生了 变化,您现在可以像在 Express 3.0 中一样使用 express.json()express.urlencoded()

Express 4.0 到 4.15 这是 不同 的:

 $ npm install --save body-parser

接着:

 var bodyParser = require('body-parser')
 app.use( bodyParser.json() ); // to support JSON-encoded bodies
 app.use(bodyParser.urlencoded({ // to support URL-encoded bodies
 extended: true
 }));

其余的就像在 Express 3.0 中一样:

首先你需要添加一些中间件来解析body的post数据。

添加以下一行或两行代码:

 app.use(express.json()); // to support JSON-encoded bodies
 app.use(express.urlencoded()); // to support URL-encoded bodies

然后,在您的处理程序中,使用 req.body 对象:

 // assuming POST: name=foo&color=red <-- URL encoding
 //
 // or POST: {"name":"foo","color":"red"} <-- JSON encoding

 app.post('/test-page', function(req, res) {
 var name = req.body.name,
 color = req.body.color;
 // ...
 });


请注意,不建议使用 express.bodyParser()

 app.use(express.bodyParser());

…相当于:

 app.use(express.json());
 app.use(express.urlencoded());
 app.use(express.multipart());

express.multipart() 存在安全问题,因此最好显式添加对您需要的特定编码类型的支持。如果您确实需要多部分编码(例如支持上传文件),那么您应该 阅读此.

原文由 Drew Noakes 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 express.bodyParser() 的安全问题

While all the other answers currently recommend using the express.bodyParser() middleware, this is actually a wrapper around the express.json() , express.urlencoded() , and express.multipart() middlewares ( http://expressjs.com/api.html#bodyParser )。表单请求主体的解析由 express.urlencoded() 中间件完成,这就是您在 req.body 对象上公开表单数据所需的全部。

由于 安全问题 express.multipart() / connect.multipart() 为所有上传的文件创建临时文件(并且不被垃圾收集),现在 建议 不要使用 express.bodyParser() 包装器,而是只使用你需要的中间件。

注意: connect.bodyParser() 将很快更新为仅包括 urlencodedjson 当 Connect 3.0 发布时(Express 扩展)。


所以简而言之,而不是……

 app.use(express.bodyParser());

…你应该使用

app.use(express.urlencoded());
app.use(express.json());      // if needed

如果/当您需要处理多部分表单(文件上传)时,请使用第三方库或中间件,例如 multiparty、busboy、dicer 等。

原文由 Sean Lynch 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题