这是我的简单表格:
<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.query['email']
或sReq.params['email']
等。它们都不起作用。它们都返回undefined
。
当我更改为 Get 呼叫时,它可以工作,所以.. 有什么想法吗?
从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 中一样:
首先,您需要添加一些中间件来解析正文的发布数据。
添加以下两行代码之一或全部:
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()
存在安全性问题,因此最好为所需的特定编码类型显式添加支持。如果您确实需要多部分编码(例如,支持上传文件),则应阅读。
使用 express.bodyParser()的安全问题
尽管目前所有其他答案都建议使用express.bodyParser()
中间件,但这实际上是对express.json()
, express.urlencoded()
和express.multipart()
中间件的包装(http://expressjs.com /api.html#bodyParser )。表单请求主体的解析是由express.urlencoded()
中间件完成的,您只需要将表单数据公开到req.body
对象即可。
出于安全方面的考虑, express.multipart()
/ connect.multipart()
如何为所有上载的文件创建临时文件(并且不会进行垃圾回收),因此建议不要使用express.bodyParser()
包装器,而应使用只有您需要的中间件。
注意: connect.bodyParser()
很快将被更新,以在发布 Connect 3.0(Express 扩展)时urlencoded
和json
简而言之,而不是...
app.use(express.bodyParser());
... 您应该使用
app.use(express.urlencoded());
app.use(express.json()); // if needed
并且如果 / 当您需要处理多部分表单(文件上传)时,请使用第三方库或中间件,例如多方,busboy,dicer 等。
注意:此答案适用于 Express2。有关 Express 3,请参见此处。
如果您使用的是 connect / express,则应使用bodyParser 中间件: Expressjs 指南中对此进行了说明。
// example using express.js:
var express = require('express')
, app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(req, res){
var email = req.param('email', null); // second parameter is default
});
这是原始的仅连接版本:
// example using just connect
var connect = require('connect');
var url = require('url');
var qs = require('qs');
var server = connect(
connect.bodyParser(),
connect.router(function(app) {
app.post('/userlogin', function(req, res) {
// the bodyParser puts the parsed request in req.body.
var parsedUrl = qs.parse(url.parse(req.url).query);
var email = parsedUrl.email || req.body.email;;
});
})
);
querystring 和 body 都是使用Rails 样式的参数处理( qs
)而不是低级querystring
库进行解析的。 qs
解析重复的参数,该参数需要使用方括号: name[]=val1&name[]=val2
。它还支持嵌套地图。除了解析 HTML 表单提交,bodyParser 可以自动解析 JSON 请求。
编辑:我阅读了 express.js 并修改了答案,以使 Express 用户更加自然。