这是我的简单表单:
<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。email或sReq。查询['email']或sReq。params['邮件'],等等。没有一个有用。它们都返回undefined。
当我更改为Get调用时,它可以工作,所以。任何想法?
使用express.bodyParser()的安全问题
虽然目前所有其他答案都建议使用express.bodyParser()中间件,但这实际上是express.json()、express.urlencoded()和express.multipart()中间件(http://expressjs.com/api.html#bodyParser)的包装器。表单请求体的解析由express.urlencoded()中间件完成,这是在req时公开表单数据所需要的全部内容。体对象。
由于express.multipart()/connect.multipart()如何为所有上传的文件创建临时文件(并且不会被垃圾收集)存在安全问题,现在建议不要使用express.bodyParser()包装器,而是只使用所需的中间件。
注意:Connect . bodyparser()将很快更新到只包括urlencoded和json当Connect 3.0发布(Express扩展)。
所以简而言之,与其…
app.use(express.bodyParser());
...你应该使用
app.use(express.urlencoded());
app.use(express.json()); // if needed
如果/当你需要处理多部分表单(文件上传)时,使用第三方库或中间件,如multiparty、busboy、dicer等。
从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一样:
首先,您需要添加一些中间件来解析主体的post数据。
添加以下一行或两行代码:
app.use(express.json()); // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies
然后,在处理程序中使用req。体对象:
// 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()存在安全问题,因此最好显式地添加对所需的特定编码类型的支持。如果你确实需要多部分编码(例如支持上传文件),那么你应该阅读这篇文章。
后端:
import express from 'express';
import bodyParser from 'body-parser';
const app = express();
app.use(bodyParser.json()); // add a middleware (so that express can parse request.body's json)
app.post('/api/courses', (request, response) => {
response.json(request.body);
});
前端:
fetch("/api/courses", {
method: 'POST',
body: JSON.stringify({ hi: 'hello' }), // convert Js object to a string
headers: new Headers({ "Content-Type": "application/json" }) // add headers
});
其他回答讨论了在服务器端使用的中间件。我的回答试图为开发人员提供一个简单的剧本来调试自己的问题。
在这个问题中,情况是:
在客户端有一个表单
数据是通过点击提交按钮发送的,你不使用JavaScript发送请求(所以没有fetch, axios, xhr,…但我们可以在以后针对这些情况扩展解决方案)
您在服务器端使用Express
您无法访问Express代码中的数据。要求的事情。Body未定义
下面是一些你可以自己找到解决方法的方法:
打开Network选项卡并搜索您的请求。
检查请求头Content-Type。在这种情况下(表单提交),头可能是application/x-www-form-urlencoded或multipart/form-data如果你发送一个文件(与enctype="multipart/form-data"在表单标签)
现在,如果您使用适当的中间件来解析传入的请求,请检查Express代码。
如果你的Content-Type是application/x-www-form-urlencoded,那么你应该有app.use(express. use)。Urlencoded ({extended: true}))。
如果您的Content-Type是multipart/form-data:因为Express没有内置的中间件来解析这类请求,您应该使用另一个库。穆尔特是个不错的选择。
如果您已经完成了上面的所有步骤,现在就可以访问所需的数据了。身体:)。如果语法有问题,应该检查Express文档页面。语法可以改变,因为这个问题是很久以前发布的。
现在,我们可以将这个简单的剧本扩展到涉及JavaScript代码的其他情况。关键是检查请求的Content-Type。如果你看到application/json,那么你应该在你的代码中使用app.use(express.json())。
总之,找到您的请求Content-Type,然后使用适当的中间件来解析它。