864

这是我的简单表格:

<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.emailor sReq.query['email']orsReq.params['email']等​​。它们都不起作用。他们都回来了undefined

当我更改为 Get 调用时,它可以工作,所以..有什么想法吗?

4

23 回答 23

1348

从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中一样:

首先你需要添加一些中间件来解析body的post数据。

添加以下一行或两行代码:

app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies

然后,在您的处理程序中,使用该req.body对象:

// 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(),因此最好明确添加对您需要的特定编码类型的支持。如果您确实需要多部分编码(例如支持上传文件),那么您应该阅读此.

于 2012-08-17T15:30:04.163 回答
101

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

虽然目前所有其他答案都建议使用express.bodyParser()中间件,但这实际上是express.json(),express.urlencoded()express.multipart()中间件 ( http://expressjs.com/api.html#bodyParser ) 的包装。表单请求主体的解析由express.urlencoded()中间件完成,您只需将表单数据暴露在req.body对象上即可。

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

注意:connect.bodyParser()将很快更新为仅包含Connect 3.0urlencoded并且json在发布时(Express 扩展)。


所以简而言之,而不是......

app.use(express.bodyParser());

...你应该使用

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

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

于 2013-11-21T22:00:47.000 回答
87

注意:此答案适用于 Express 2。请参阅此处了解 Express 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 的用户更自然。

于 2011-04-19T02:21:23.027 回答
38

如果您想在没有中间件的情况下构建发布的查询,这将做到这一点:

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

不过,使用中间件可能会更好,这样您就不必在每条路由中一遍又一遍地编写它。

于 2014-07-22T02:19:43.230 回答
27

Express 4 用户注意事项:

如果您尝试将app.use(express.bodyParser());其放入您的应用程序,当您尝试启动您的 Express 服务器时,您将收到以下错误:

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

您必须与 npmbody-parser分开安装包,然后使用类似以下的内容(示例取自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();
})
于 2014-05-10T20:52:49.987 回答
21

给定某种形式:

<form action='/somepath' method='post'>
   <input type='text' name='name'></input>
</form>

使用快递

app.post('/somepath', function(req, res) {

    console.log(JSON.stringify(req.body));

    console.log('req.body.name', req.body['name']);
});

输出:

{"name":"x","description":"x"}
req.param.name x
于 2012-01-20T11:12:56.993 回答
20

后端:

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
});
于 2016-08-05T18:05:57.270 回答
16
app.use(express.bodyParser());

然后对于app.post请求,您可以通过req.body.{post request variable}.

于 2012-04-09T19:18:39.787 回答
15

Express 4.4.1 更新

以下中间件已从 Express 中删除。

  • 身体解析器
  • json
  • urlencoded
  • 多部分

当您像在 express 3.0 中那样直接使用中间件时。您将收到以下错误:

Error: Most middleware (like urlencoded) is no longer bundled with Express and 
must be installed separately.


为了利用这些中间件,现在您需要分别为每个中间件执行npm 。

由于 bodyParser 被标记为已弃用,所以我推荐以下使用 json、urlencode 和 multipart 解析器的方式,如强大的、连接多方。(多部分中间件也已弃用)。

还要记住,只是定义了 urlencode + json,表单数据不会被解析,req.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);
于 2014-06-12T04:13:49.040 回答
9

我正在寻找这个确切的问题。我遵循了上面的所有建议,但 req.body 仍然返回一个空对象 {}。就我而言,这就像 html 不正确一样简单。

在表单的 html 中,确保'name'在输入标签中使用该属性,而不仅仅是'id'. 否则,什么都不会被解析。

<input id='foo' type='text' value='1'/>             // req = {}
<input id='foo' type='text' name='foo' value='1' /> // req = {foo:1}

我的白痴错误是你的好处。

于 2016-11-18T14:20:48.307 回答
8

对于 Express 4.1 及更高版本

由于大多数答案都使用 Express、bodyParser、connect;不推荐使用 multipart 的地方。有一种安全的方式可以轻松发送多部分后的对象。

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()处理应用程序/json

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

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

于 2015-08-30T10:37:32.563 回答
8

更新

从 开始Express version 4.16+,他们自己的 body-parser 实现现在包含在默认的 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上的文档)。

于 2020-09-21T20:39:50.310 回答
7

你不应该使用app.use(express.bodyParser())。BodyParser 是 json + urlencoded + mulitpart 的结合。你不应该使用它,因为 multipart 将在 connect 3.0 中被删除。

要解决这个问题,您可以这样做:

app.use(express.json());
app.use(express.urlencoded());

重要的是要知道app.use(app.router)应该在 json 和 urlencoded 之后使用,否则它不起作用!

于 2014-02-18T13:52:34.907 回答
6

快递 v4.17.0

app.use(express.urlencoded( {extended: true} ))

app.post('/userlogin', (req, res) => {    

   console.log(req.body) // object

   var email = req.body.email;

}

演示表格

另一个答案相关

于 2020-12-16T05:35:32.967 回答
5

请求流式传输对我有用

req.on('end', function() {
    var paramstring = postdata.split("&");
});

var postdata = "";
req.on('data', function(postdataChunk){
    postdata += postdataChunk;
});
于 2015-04-29T18:01:27.137 回答
5

写于 Express 版本 4.16

在路由器函数中,您可以使用req.body属性来访问 post 变量。例如,如果这是POST您的表单的路线,它会发回您输入的内容:

function(req,res){
      res.send(req.body);

      //req.body.email would correspond with the HTML <input name="email"/>
}

PS给那些熟悉PHP的人:为了访问$_GET我们使用的PHP变量req.query和访问$_POST我们req.body在Node.js中使用的PHP变量。

于 2019-10-04T16:33:52.990 回答
4

我可以通过对POSTGET请求 使用以下代码来找到所有参数。

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));
})
于 2016-09-21T13:08:46.243 回答
1
var express        =         require("express");
var bodyParser     =         require("body-parser");
var app            =         express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get('/',function(req,res){
  res.sendfile("index.html");
});
app.post('/login',function(req,res){
  var user_name=req.body.user;
  var password=req.body.password;
  console.log("User name = "+user_name+", password is "+password);
  res.end("yes");
});
app.listen(3000,function(){
  console.log("Started on PORT 3000");
})
于 2018-01-19T20:51:45.757 回答
1

可以按如下方式检索 Post 参数:

app.post('/api/v1/test',Testfunction);
http.createServer(app).listen(port, function(){
    console.log("Express server listening on port " + port)
});

function Testfunction(request,response,next) {
   console.log(request.param("val1"));
   response.send('HI');
}
于 2017-10-11T15:30:23.777 回答
0

使用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');
});
于 2017-11-06T13:46:43.453 回答
0

来自官方文档版本 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)
})
于 2020-09-10T08:03:42.500 回答
0

您使用req.query.post了错误的方法,req.query.post适用于method=getmethod=post适用于body-parser

只需通过更改帖子尝试此操作即可:

<form id="loginformA" action="userlogin" method="get">
<div>
    <label for="email">Email: </label>
    <input type="text" id="email" name="email"></input>
</div>
<input type="submit" value="Submit"></input>  
</form>

在快速代码中使用'app.get'

于 2018-03-07T05:25:46.483 回答
-1

当您在 HTML 表单中使用 POST 方法时,您需要从服务器端(即 Node.js)的 req.body 中捕获数据。并添加

var bodyParser = require('body-parser')
app.use( bodyParser.json() );    
app.use(bodyParser.urlencoded({extended: false}));

或者

在 HTML 中使用 method='GET' 并通过服务器端的 req.query 捕获数据,即 Node.js

于 2020-08-03T05:52:36.567 回答