这是我的简单表单:

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


当前回答

表达v4.17.0

app.use(express.urlencoded( {extended: true} ))

app.post('/userlogin', (req, res) => {    

   console.log(req.body) // object

   var email = req.body.email;

}

express.urlencoded

演示的形式

另一个答案

其他回答

从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()存在安全问题,因此最好显式地添加对所需的特定编码类型的支持。如果你确实需要多部分编码(例如支持上传文件),那么你应该阅读这篇文章。

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');
}

更新

从Express 4.16+版本开始,它们自己的主体解析器实现现在包含在默认的Express包中,因此您不需要下载另一个依赖项。

您可能在代码中添加了如下所示的一行:

app.use(bodyparser.json()); //utilizes the body-parser package

如果您正在使用Express 4.16+,您现在可以将这一行替换为:

app.use(express.json()); //Used to parse JSON bodies

因为express.json()中的代码是基于bodyparser.json()的,所以这不会在应用程序中引入任何破坏性的更改。

如果你的环境中也有以下代码:

app.use(bodyParser.urlencoded({extended: true}));

你可以用:

app.use(express.urlencoded()); //Parse URL-encoded bodies

最后需要注意的是:仍然有一些非常具体的情况下可能仍然需要body-parser,但在大多数情况下,Express的body-parser实现是大多数用例所需要的。

(详见expressjs/bodyparser中的文档)。

注:此答案为特快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之后使用是非常重要的,否则它就不起作用!