ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Express 中访问 POST 表单字段

这是我的简单表格:

<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.emailsReq.query['email']sReq.params['email'] 等。它们都不起作用。它们都返回 undefined

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

安全:使用此处答案中 bodyParser() 的每个人也应该阅读 @SeanLynch 's answer below

D
Drew Noakes

changed 再次启动 Express 4.16.0,您现在可以像在 Express 3.0 中一样使用 express.json()express.urlencoded()

这是 differentExpress 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() 存在安全问题,因此最好明确添加对您需要的特定编码类型的支持。如果您确实需要多部分编码(例如支持上传文件),那么您应该read this


如果此答案不正确,请确保您设置了 content-type 标头,例如:curl -d '{"good_food":["pizza"]}' -H 'content-type:application/json' "http://www.example.com/your_endpoint"
发布带有名称/值对的表单和发布 JSON 正文之间有什么区别?他们都出现在 req.body 中吗?
@chovy 是的,他们有。 bodyParser 将 JSON、URL 编码和多部分数据抽象到 req.body 对象中。
这段代码给了我错误,因为中间件不再与 Express 捆绑在一起;你必须使用 body-parser: github.com/senchalabs/connect#middleware
对于使用 Express 4 读取 json,仅 app.use(require('body-parser').json()) 行就足够了。然后,您可以从路由定义中的请求主体对象(即 req.body)读取 json 数据。
S
Sean Lynch

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

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

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

注意:当 Connect 3.0(Express 扩展)发布时,connect.bodyParser() 将很快更新为仅包含 urlencodedjson

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

app.use(express.bodyParser());

...你应该使用

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

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


在问题下方添加评论,以便更多人看到您的疑虑和建议。您认为 Andrew Kelley blog post 中详述的其他解决方案(仍然)是否相关? (只是求别人,我的需求纯属内部工具^^)
@FelipeAls - 是的,我也打算参考 Andrew 的帖子。这些建议中的任何一个(考虑到每个建议的缺点)都是相关的。
此外,一旦发布了 Connect 3.0,但未将 multipart() 作为 bodyParser() 的一部分,bodyParser() 将再次变得“安全”,但您需要使用第三方库显式启用多部分支持。
C
Community

注意:此答案适用于 Express 2。有关 Express 3,请参见 here

如果您使用的是 connect/express,则应使用 bodyParser middleware:它在 Expressjs guide 中进行了描述。

// 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-style parameter handling (qs) 而不是 low-level querystring library 进行解析。为了解析带有 qs 的重复参数,参数需要有括号:name[]=val1&name[]=val2。它还支持嵌套地图。除了解析 HTML 表单提交,bodyParser 还可以自动解析 JSON 请求。

编辑:我阅读了 express.js 并修改了我的答案,以便对 Express 用户更自然。


嗯。。好。我试试bodyParser()。医生说我可以从 req.query() 得到它,但我什么也没得到。这很奇怪。 Get tho 我没有问题。
不,req.query 只是 GET 参数。您通过 req.body 获取 POST 数据。函数 req.params() 包括它们两者。
在我没有注意到的情况下,一次杂散的点击意外地否决了这个答案!现在 StackOverflow 不会让我改变它。特别是。令人沮丧,因为这很有帮助......我赞成你的另一个好答案,我并没有明确地寻找来弥补它。 :)
P
Peter Mortensen

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

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

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


sooo....方便,对于那些不想依赖迟早会被弃用的库的人
您可以轻松构建自己的中间件
这是一个很好的答案,但为什么会有额外的文字“----------------------------359856253150893337905494 Content-Disposition: form-data; name ="fullName" Ram ----------------359856253150893337905494--" 我不想要那个号码。
m
mplewis

Express 4 用户注意事项:

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

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

您必须单独安装软件包 body-parser from npm,然后使用类似以下的内容(示例取自 the GitHub page):

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

非常感谢您提供这些信息。正在拉扯我的头发,试图处理使用 bodyParser 的新方法!这是一个重大突破——非常感谢
heplp:不推荐使用 body-parser bodyParser:使用单独的 json/urlencoded 中间件
D
David

给定某种形式:

<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

没有为我工作。需要使用 app.use(express.bodyParser());
@cawecoy 在这里完全一样,但 express.bodyParser() 对我来说效果不佳,它已弃用
@MohammadFaizankhan 这是一项实验性工作,我不再使用快递,现在无能为力。谷歌它有类似的功能 express.bodyParser()。好幸运!
这仅在您使用 body-parser 时才有效
E
Evgenia Karunus

后端:

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

啊,在 javascript 中总是默认以 JSON 格式思考。
D
Drew Noakes
app.use(express.bodyParser());

然后对于 app.post 请求,您可以通过 req.body.{post request variable} 获取帖子值。


您在这里的发布请求变量,是有问题的输入字段的 id 还是整个表单或什么?
express.bodyParser() 已弃用。更新你的答案
N
Nick

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

我想这真的是很糟糕的功能更新
只是为了身体解析我必须做很多代码。黑客是什么
我必须将“.middleware()”添加到 require('json-middleware') 才能使其正常工作。
c
cwingrav

我正在寻找这个确切的问题。我遵循了上面的所有建议,但 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}

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


这里同样的问题。但我从一开始就使用 name 属性。让我们看看是什么问题。
S
Shivam Jha

更新

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


L
Lalit Umbarkar

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


H
HenioJR

你不应该使用 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 之后使用,否则它不起作用!


a
antelove

快递 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

Demo Form

Another Answer Related


设置扩展为真的目的是什么?这意味着什么?
此选项允许在使用 querystring 库(如果为 false)或 qs 库(如果为 true)解析 URL 编码数据之间进行选择。 “扩展”语法允许将丰富的对象和数组编码为 URL 编码格式,从而提供类似 JSON 的 URL 编码体验。
z
zeah

请求流式传输对我有用

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

var postdata = "";
req.on('data', function(postdataChunk){
    postdata += postdataChunk;
});

比执行 postdata.split("&") 更好的是加载核心模块 querystring = require('querystring'),然后使用 querystring.parse(postdata) 解析您的 postdata
L
Logan

写于 Express 版本 4.16

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

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

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

对熟悉 PHP 的人的 PS:为了访问 PHP 的 $_GET 变量,我们使用 req.query 并访问 PHP 的 $_POST 变量,我们在 Node.js 中使用 req.body


M
Max Base

我可以通过对 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));
})

你介意用你的快递版本更新答案吗?
A
AID

official 文档版本 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)
})

s
seme
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");
})

M
Max Base

可以按如下方式检索 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');
}

你知道这行不通吗? param 用于 GET 请求.. 不是 POST 并且您的示例缺少详细信息,对于新手来说非常混乱。最重要的是 request.param 实际上已被弃用,因此您的示例在很多层面上都是错误的。
M
Max Base

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

这对我来说非常成功! app.use(express.urlencoded({ extended: true })) 在我的情况下不起作用,因此我无法获取正文数据。谢谢!
M
Max Base

您在使用 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'


使用 POST 而不是 GET 的原因有很多 - 安全性和数据大小都在前面 - 所以这不是一个合适的方法。
P
Pratheek Reddy

当您在 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