如何检索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.email
sReq.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()
中间件完成的,仅是将to11ѭ对象公开表单数据所需的全部工作。 由于出于安全考虑,ѭ16/ 24会为所有上载的文件创建临时文件(并且不会进行垃圾回收),因此建议不要使用
express.bodyParser()
包装器,而应仅使用所需的中间件。 注意:当发布Connect 3.0(Express扩展了该版本)时,
connect.bodyParser()
将很快更新为仅包括
urlencoded
json
。 简而言之,而不是...
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和主体均使用Rails样式的参数处理(
qs
)而不是低级的
querystring
库进行解析。为了使用
qs
解析重复的参数,该参数需要带有方括号:
name[]=val1&name[]=val2
。它还支持嵌套地图。除了解析HTML表单提交,bodyParser还可以自动解析JSON请求。 编辑:我阅读了express.js并修改了答案,使Express用户更加自然。
如果您要构建不带中间件的发布查询,则将执行此操作:
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
尽管最好使用中间件,所以您不必在每条路线中都一遍又一遍地编写它。
Express 4用户注意事项: 如果尝试将ѭ39放入应用程序中,则尝试启动Express服务器时会出现以下错误: 错误:大多数中间件(如bodyParser)不再与Express捆绑在一起,必须单独安装。请参阅https://github.com/senchalabs/connect#middleware。 您必须将软件包
body-parser
与npm分开安装,然后使用类似以下的内容(示例取自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();
})
给定某种形式:
<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和multipar解析器(如强大,connect-multiparty)的以下方式。 (不建议使用多部分中间件)。 还要记住,仅定义urlencode + json,就不会解析表单数据,并且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);
后端:
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\' }), // convert Js object to a string
  headers: new Headers({ \"Content-Type\": \"application/json\" }) // add headers
});
对于Express 4.1及更高版本 由于大多数答案都用于Express,bodyParser,connect;不建议使用multipart的地方。有一种安全的方法可以轻松发送后期多部分对象。 Multer可以替代connect.multipart()。 要安装软件包
$ npm install multer
将其加载到您的应用中:
var multer = require(\'multer\');
然后,将其与其他表单解析中间件一起添加到中间件堆栈中。
app.use(express.json());
app.use(express.urlencoded());
app.use(multer({ dest: \'./uploads/\' }));
connect.json()处理application / json connect.urlencoded()处理应用程序/ x-www-form-urlencoded multer()处理多部分/表单数据
我正在寻找这个确切的问题。我遵循了以上所有建议,但是req.body仍返回空对象{}。就我而言,这就像html不正确一样简单。 在表单的html中,确保在输入标签中使用
\'name\'
属性,而不仅仅是
\'id\'
。否则,将不解析任何内容。
<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的并集。您不应该使用此功能,因为在connect 3.0中将删除多部分。 要解决此问题,您可以执行以下操作:
app.use(express.json());
app.use(express.urlencoded());
知道应该在json和urlencode之后使用app.use(app.router),这是非常重要的,否则它将不起作用!
请求流式传输对我有用
req.on(\'end\', function() {
    var paramstring = postdata.split(\"&\");
});

var postdata = \"\";
req.on(\'data\', function(postdataChunk){
    postdata += postdataChunk;
});
通过对POST和GET请求使用以下代码,我可以找到所有参数。
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));
})
var express        =         require(\"express\");
var bodyParser     =         require(\"body-parser\");
var app            =         express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get(\'/\',function(req,res){
  res.sendfile(\"index.html\");
});
app.post(\'/login\',function(req,res){
  var user_name=req.body.user;
  var password=req.body.password;
  console.log(\"User name = \"+user_name+\", password is \"+password);
  res.end(\"yes\");
});
app.listen(3000,function(){
  console.log(\"Started on PORT 3000\");
})
可以按以下方式检索发布参数:
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版本4.16 在router函数内部,您可以使用ѭ11属性来访问post变量。例如,如果这是表单的“ 64”路线,它将发回您输入的内容:
function(req,res){
      res.send(req.body);

      //req.body.email would correspond with the HTML <input name=\"email\"/>
}
附言对于那些熟悉PHP的人:为了访问PHP \的
$_GET
变量,我们使用
req.query
,并访问PHP \的
$_POST
变量,我们在Node.js中使用ѭ11.。
您使用错误的方法使用
req.query.post
method=get
适用于
method=get
method=post
适用于人体分析器。 只需通过更改帖子来尝试以下操作即可:
<form id=\"loginformA\" action=\"userlogin\" method=\"get\">
<div>
    <label for=\"email\">Email: </label>
    <input type=\"text\" id=\"email\" name=\"email\"></input>
</div>
<input type=\"submit\" value=\"Submit\"></input>  
</form>
在快速代码中使用\'app.get \'
使用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\');
});

要回复问题请先登录注册