如何检索POST查询参数?

这是我简单的forms:

<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.0中,情况再次发生了变化 :

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

首先你需要添加一些中间件来parsing主体的后期数据。

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

 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()存在安全问题,因此最好明确地添加对所需的特定编码types的支持。 如果你需要多部分编码(例如支持上传文件),那么你应该阅读这个 。

注意 :这个答案是用于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;; }); }) ); 

查询string和正文都使用Rails风格的参数处理( qs )而不是低级querystring库进行分析 。 为了用qsparsing重复的参数,参数需要有括号: name[]=val1&name[]=val2 。 它也支持嵌套的地图。 除了parsingHTML表单提交之外,bodyParser还可以自动parsingJSON请求。

编辑 :我读了express.js和修改我的答案是更快速的用户自然。

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

虽然所有其他答案目前推荐使用express.bodyParser()中间件,但实际上这是express.json()express.urlencoded()express.multipart()中间件( http://expressjs.com); /api.html#bodyParser )。 表单请求正文的parsing由express.urlencoded()中间件来完成,并且是您在req.body对象上公开表单数据req.body

由于express.multipart() / connect.multipart()为所有上传的文件创build临时文件(而不是垃圾收集), 安全性担忧 ,所以现在build议不要使用express.bodyParser()包装器,而是使用只有你需要的中间件。

注意: connect.bodyParser()很快就会被更新,只有在Connect 3.0发布(Express扩展)时才包含urlencodedjson


所以总之,而不是…

 app.use(express.bodyParser()); 

…你应该使用

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

如果您需要处理多部分表单(file upload),请使用第三方库或中间件,如多方,公交车,切丁机等。

这将做到这一点,如果你想build立没有中间件发布的查询:

 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 

尽pipe使用中间件可能会更好,所以您不必在每条path上反复写入。

Express 4用户注意事项:

如果你试着把app.use(express.bodyParser()); 到您的应用程序,当您尝试启动您的快速服务器时,您会收到以下错误:

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

你必须从npm中分别安装package body-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(); }) 

给定一些forms:

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

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

Express 4.4.1更新

以下中间件从Express中删除。

  • bodyParser
  • 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和多部分分析器如下强大的连接多方。 (多部分中间件也被弃用)。

另外请记住,只需定义urlencode + json,表单数据将不会被parsing,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); 

适用于Express 4.1及以上版本

由于大多数答案正在使用Express,bodyParser,连接; 多部分被弃用的地方。 有一个安全的方式来发送后多部分对象很容易。

Multer可以用来替代connect.multipart()。

安装软件包

 $ npm install multer 

加载它在您的应用程序中:

 var multer = require('multer'); 

然后,将它与其他表单parsing中间件一起添加到中间件堆栈中。

 app.use(express.json()); app.use(express.urlencoded()); app.use(multer({ dest: './uploads/' })); 

connect.json()处理application / json

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

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

后端:

 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' }), // stringify JSON headers: new Headers({ "Content-Type": "application/json" }); // add headers }); 

我正在寻找这个确切的问题。 我按照上面的所有build议,但req.body仍然返回一个空的对象{}。 在我的情况下,它就像HTML不正确一样简单。

在表单的html中,确保在input标签中使用'name'属性,而不仅仅是'id' 。 否则,没有任何parsing。

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

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

你不应该使用app.use(express.bodyParser()) 。 BodyParser是json + urlencoded + mulitpart的联合。 你不应该使用这个,因为连接3.0中多部分将被删除。

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

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

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

请求stream为我工作

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

通过使用POSTGET请求的以下代码,我可以find所有参数。

  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)); }) 
 Post Parameters can be retrieved as follows- 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'); } 

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