这是我的简单表单:

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

其他回答

特快4用户注意事项:

如果你试着把app.use(express.bodyParser());进入你的应用程序,你会得到以下错误当你试图启动你的Express服务器:

错误:大多数中间件(如bodyParser)不再与Express捆绑,必须单独安装。请参见https://github.com/senchalabs/connect#middleware。

你必须从npm中单独安装包体解析器,然后使用如下代码(示例取自GitHub页面):

var express    = require('express');
var bodyParser = require('body-parser');

var app = express();

app.use(bodyParser());

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next();
})

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

更新

从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中的文档)。

其他回答讨论了在服务器端使用的中间件。我的回答试图为开发人员提供一个简单的剧本来调试自己的问题。


在这个问题中,情况是:

在客户端有一个表单 数据是通过点击提交按钮发送的,你不使用JavaScript发送请求(所以没有fetch, axios, xhr,…但我们可以在以后针对这些情况扩展解决方案) 您在服务器端使用Express 您无法访问Express代码中的数据。要求的事情。Body未定义

下面是一些你可以自己找到解决方法的方法:

打开Network选项卡并搜索您的请求。 检查请求头Content-Type。在这种情况下(表单提交),头可能是application/x-www-form-urlencoded或multipart/form-data如果你发送一个文件(与enctype="multipart/form-data"在表单标签) 现在,如果您使用适当的中间件来解析传入的请求,请检查Express代码。

如果你的Content-Type是application/x-www-form-urlencoded,那么你应该有app.use(express. use)。Urlencoded ({extended: true}))。 如果您的Content-Type是multipart/form-data:因为Express没有内置的中间件来解析这类请求,您应该使用另一个库。穆尔特是个不错的选择。

如果您已经完成了上面的所有步骤,现在就可以访问所需的数据了。身体:)。如果语法有问题,应该检查Express文档页面。语法可以改变,因为这个问题是很久以前发布的。

现在,我们可以将这个简单的剧本扩展到涉及JavaScript代码的其他情况。关键是检查请求的Content-Type。如果你看到application/json,那么你应该在你的代码中使用app.use(express.json())。

总之,找到您的请求Content-Type,然后使用适当的中间件来解析它。

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

演示的形式

另一个答案