如何检索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.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 2.请参阅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;;
});
})
);
查询字符串和正文都使用Rails风格的参数处理( qs
)而不是低级querystring
库进行分析。 为了用qs
解析重复的参数,参数需要有括号: name[]=val1&name[]=val2
。 它也支持嵌套地图。 除了解析HTML表单提交之外,bodyParser还可以自动解析JSON请求。
编辑 :我读了express.js和修改我的答案是更快速的用户自然。
使用express.bodyParser()的安全问题
虽然目前所有其他答案都建议使用express.bodyParser()
中间件,但它实际上是express.json()
, express.urlencoded()
和express.multipart()
中间件(http://expressjs.com) /api.html#bodyParser)。 表单请求正文的解析由express.urlencoded()
中间件完成,并且是您在req.body
对象上公开表单数据req.body
。
由于express.multipart()
/ connect.multipart()
为所有上传的文件创建临时文件(并且未被垃圾收集),所以建议不要使用express.bodyParser()
包装器,而是使用express.bodyParser()
只有你需要的中间件。
注意: connect.bodyParser()
将很快更新,只有在Connect 3.0发布(Express扩展)时才包含urlencoded
和json
。
总之,而不是...
app.use(express.bodyParser());
...你应该使用
app.use(express.urlencoded());
app.use(express.json()); // if needed
并且如果/当您需要处理多部分表单(文件上传)时,请使用第三方库或中间件,如多方,公交车,切丁机等。
链接地址: http://www.djcxy.com/p/45859.html