如何检索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.email
或sReq.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
库进行分析 。 为了用qs
parsing重复的参数,参数需要有括号: 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扩展)时才包含urlencoded
和json
。
所以总之,而不是…
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; });
通过使用POST和GET请求的以下代码,我可以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'); });