这是我的简单表单:

<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.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);

其他回答

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

适用于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()处理多部分/表单数据

app.use(express.bodyParser());

然后对于app.post请求,你可以通过req.body获取post值。{post请求变量}。

如果你想在没有中间件的情况下构建已发布的查询,这可以做到:

app.post("/register/",function(req,res){
    var bodyStr = '';
    req.on("data",function(chunk){
        bodyStr += chunk.toString();
    });
    req.on("end",function(){
        res.send(bodyStr);
    });

});

这将把这个发送到浏览器

email=emailval&password1=pass1val&password2=pass2val

使用中间件可能更好,这样你就不必在每条路由中一遍又一遍地写这个。

来自正式文档版本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)
})