协慌网

登录 贡献 社区

如何访问 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 呼叫时,它可以工作,所以.. 有什么想法吗?

答案

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

首先,您需要添加一些中间件来解析正文的发布数据。

添加以下两行代码之一或全部:

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.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.0(Express 扩展)时urlencodedjson


简而言之,而不是...

app.use(express.bodyParser());

... 您应该使用

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

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

注意:此答案适用于 Express2。有关 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;;
    });
  })
);

querystring 和 body 都是使用Rails 样式的参数处理( qs而不是低级querystring进行解析的。 qs解析重复的参数,该参数需要使用方括号: name[]=val1&name[]=val2 。它还支持嵌套地图。除了解析 HTML 表单提交,bodyParser 可以自动解析 JSON 请求。

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