这是我的简单表单:

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


当前回答

适用于Express 4.1及以上版本

因为大多数答案都是使用Express, bodyParser, connect;其中不建议使用多部分。有一种安全的方法可以轻松地发送post多部分对象。

Multer可以用来代替connect.multipart()。

安装包

$ npm install multer

在你的应用中加载它:

var multer = require('multer');

然后,将它与其他表单解析中间件一起添加到中间件堆栈中。

app.use(express.json());
app.use(express.urlencoded());
app.use(multer({ dest: './uploads/' }));

Connect.json()处理application/json

Connect.urlencoded()处理application/x-www-form-urlencoded

multer()处理多部分/表单数据

其他回答

适用于Express 4.1及以上版本

因为大多数答案都是使用Express, bodyParser, connect;其中不建议使用多部分。有一种安全的方法可以轻松地发送post多部分对象。

Multer可以用来代替connect.multipart()。

安装包

$ npm install multer

在你的应用中加载它:

var multer = require('multer');

然后,将它与其他表单解析中间件一起添加到中间件堆栈中。

app.use(express.json());
app.use(express.urlencoded());
app.use(multer({ dest: './uploads/' }));

Connect.json()处理application/json

Connect.urlencoded()处理application/x-www-form-urlencoded

multer()处理多部分/表单数据

使用express-fileupload包:

var app = require('express')();
var http = require('http').Server(app);
const fileUpload = require('express-fileupload')

app.use(fileUpload());

app.post('/', function(req, res) {
  var email = req.body.email;
  res.send('<h1>Email :</h1> '+email);
});

http.listen(3000, function(){
  console.log('Running Port:3000');
});

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

来自正式文档版本4

const express = require('express')
const app = express()
app.use(express.json());
app.use(express.urlencoded({ extended: true })) 

app.post('/push/send', (request, response) => {
  console.log(request.body)
})

表达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

演示的形式

另一个答案