如何检索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呼叫时,它可以工作,所以......任何想法?


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扩展)时才包含urlencodedjson


总之,而不是...

app.use(express.bodyParser());

...你应该使用

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

并且如果/当您需要处理多部分表单(文件上传)时,请使用第三方库或中间件,如多方,公交车,切丁机等。

链接地址: http://www.djcxy.com/p/45859.html

上一篇: How to retrieve POST query parameters?

下一篇: HTTP POST using JSON in Java