这是我的简单表单:

<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.bodyParser()的安全问题

虽然目前所有其他答案都建议使用express.bodyParser()中间件,但这实际上是express.json()、express.urlencoded()和express.multipart()中间件(http://expressjs.com/api.html#bodyParser)的包装器。表单请求体的解析由express.urlencoded()中间件完成,这是在req时公开表单数据所需要的全部内容。体对象。

由于express.multipart()/connect.multipart()如何为所有上传的文件创建临时文件(并且不会被垃圾收集)存在安全问题,现在建议不要使用express.bodyParser()包装器,而是只使用所需的中间件。

注意:Connect . bodyparser()将很快更新到只包括urlencoded和json当Connect 3.0发布(Express扩展)。


所以简而言之,与其…

app.use(express.bodyParser());

...你应该使用

app.use(express.urlencoded());
app.use(express.json());      // if needed

如果/当你需要处理多部分表单(文件上传)时,使用第三方库或中间件,如multiparty、busboy、dicer等。

其他回答

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

后端:

import express from 'express';
import bodyParser from 'body-parser';

const app = express();
app.use(bodyParser.json()); // add a middleware (so that express can parse request.body's json)

app.post('/api/courses', (request, response) => {
  response.json(request.body);
});

前端:

fetch("/api/courses", {
  method: 'POST',
  body: JSON.stringify({ hi: 'hello' }), // convert Js object to a string
  headers: new Headers({ "Content-Type": "application/json" }) // add headers
});

更新

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

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

使用express.bodyParser()的安全问题

虽然目前所有其他答案都建议使用express.bodyParser()中间件,但这实际上是express.json()、express.urlencoded()和express.multipart()中间件(http://expressjs.com/api.html#bodyParser)的包装器。表单请求体的解析由express.urlencoded()中间件完成,这是在req时公开表单数据所需要的全部内容。体对象。

由于express.multipart()/connect.multipart()如何为所有上传的文件创建临时文件(并且不会被垃圾收集)存在安全问题,现在建议不要使用express.bodyParser()包装器,而是只使用所需的中间件。

注意:Connect . bodyparser()将很快更新到只包括urlencoded和json当Connect 3.0发布(Express扩展)。


所以简而言之,与其…

app.use(express.bodyParser());

...你应该使用

app.use(express.urlencoded());
app.use(express.json());      // if needed

如果/当你需要处理多部分表单(文件上传)时,使用第三方库或中间件,如multiparty、busboy、dicer等。