这是我的简单表单:

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


当前回答

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

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

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

其他回答

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

对于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));
})

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


在这个问题中,情况是:

在客户端有一个表单 数据是通过点击提交按钮发送的,你不使用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,然后使用适当的中间件来解析它。

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

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