如何在 Express 中访问 POST 表单域

2022-08-29 22:15:58

这是我的简单形式:

<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呼叫时,它有效,所以..任何想法?


答案 1

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


答案 2

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

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

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

注意:将很快更新为仅在 Connect 3.0 发布时(Express 扩展)进行更新。connect.bodyParser()urlencodedjson


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

app.use(express.bodyParser());

...你应该使用

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

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