如何访问 POST 表单字段

IT技术 javascript node.js post express
2021-01-28 06:05:26

这是我的简单表格:

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

当我更改为 Get 调用时,它可以工作,所以.. 知道吗?

6个回答

事情已经改变了再次启动快速4.16.0,您现在可以使用express.json()express.urlencoded()就像在快车3.0

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

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

使用 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()将很快更新为仅包含urlencodedjson当 Connect 3.0 发布(Express 扩展)。


简而言之,而不是...

app.use(express.bodyParser());

...你应该使用

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

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

@FelipeAls - 是的,我也想参考安德鲁的帖子。这些建议中的任何一个(考虑到每个建议的缺点)都是相关的。
2021-03-15 06:05:26
在问题下方添加评论,以便更多人看到您的疑虑和建议。您认为Andrew Kelley 博客文章中详述的其他解决方案(仍然)是否相关?(只是问别人,我的需求纯粹是内部工具^^)
2021-04-01 06:05:26
此外,一旦 Connect 3.0 发布而不包含multipart()作为的一部分,bodyParser(),bodyParser()再次变得“安全”,但您将需要使用第三方库显式启用多部分支持。
2021-04-03 06:05:26

注意:此答案适用于 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 用户更自然。

不,req.query 只是 GET 参数。您可以通过 req.body 获取 POST 数据。函数 req.params() 包括它们。
2021-03-20 06:05:26
在我没有注意到的情况下,一次偶然的点击意外地低估了这个答案!现在 StackOverflow 不会让我改变它。特别是 令人沮丧,因为这很有帮助......我赞成你的另一个好答案,我并没有明确地寻找来弥补它。:)
2021-04-08 06:05:26
嗯。。好。我尝试使用 bodyParser()。文档说我可以从 req.query() 得到它,但我什么也没得到。这很奇怪。我对 Get tho 没有任何问题。
2021-04-09 06:05:26

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

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

不过最好使用中间件,这样您就不必在每条路线中一遍又一遍地编写它。

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

Express 4 用户注意事项:

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

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

您必须将软件包body-parsernpm分开安装,然后使用如下所示的内容(示例取自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();
})
非常感谢您提供此信息。正在努力处理使用 bodyParser 的新方法!这是一个很大的突破 - 真的很感激
2021-03-14 06:05:26
heplp:不推荐使用 body-parser bodyParser:使用单独的 json/urlencoded 中间件
2021-04-08 06:05:26