这是我的简单表单:

<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调用时,它可以工作,所以。任何想法?


当前回答

对于POST和GET请求,我可以使用以下代码找到所有参数。

var express = require('express');
var app = express();
const util = require('util');
app.post('/', function (req, res) {
    console.log("Got a POST request for the homepage");
    res.send(util.inspect(req.query,false,null));
})

其他回答

注:此答案为特快2。请看这里的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的用户来说更自然。

你不应该使用app.use(express.bodyParser())。BodyParser是json + urlencoded + multipart的组合。你不应该这样做,因为multipart将在connect 3.0中被删除。

要解决这个问题,你可以这样做:

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

知道app.use(app.router)应该在json和urlencoded之后使用是非常重要的,否则它就不起作用!

针对Express 4.4.1进行更新

从Express中删除了以下中间件。

身体解析器 杰森 乌伦编码 多部件

当您像在express 3.0中那样直接使用中间件时。你会得到以下错误:

Error: Most middleware (like urlencoded) is no longer bundled with Express and 
must be installed separately.

为了利用这些中间件,现在你需要分别为每个中间件做npm。

由于bodyParser被标记为已弃用,所以我推荐以下使用json, urlencode和多部分解析器的方式,如强大的,connect-multiparty。(多部分中间件也已弃用)。

还要记住,只是定义urlencode + json,表单数据不会被解析和请求。Body将未定义。您需要定义一个中间件来处理多部分请求。

var urlencode = require('urlencode');
var json = require('json-middleware');
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();

app.use(json);
app.use(urlencode);
app.use('/url/that/accepts/form-data', multipartMiddleware);

Post参数可通过以下方式检索:

app.post('/api/v1/test',Testfunction);
http.createServer(app).listen(port, function(){
    console.log("Express server listening on port " + port)
});

function Testfunction(request,response,next) {
   console.log(request.param("val1"));
   response.send('HI');
}

请求流对我有用

req.on('end', function() {
    var paramstring = postdata.split("&");
});

var postdata = "";
req.on('data', function(postdataChunk){
    postdata += postdataChunk;
});