如何检索POST查询参数?

时间:2011-04-19 00:38:39

标签: javascript node.js post express

这是我的简单形式:

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

23 个答案:

答案 0 :(得分:1152)

事情已经changed再次启动 Express 4.16.0 ,您现在可以像 Express 3.0一样使用express.json()express.urlencoded()

这是different 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()存在安全问题,因此最好明确添加对所需特定编码类型的支持。如果您确实需要多部分编码(例如,支持上传文件),那么您应该read this

答案 1 :(得分:81)

使用express.bodyParser()

的安全问题

虽然目前所有其他答案都建议使用express.bodyParser()中间件,但这实际上是express.json()express.urlencoded()express.multipart()中间件({{3} })。表单请求主体的解析由express.urlencoded()中间件完成,是您在req.body对象上公开表单数据所需的全部内容。

由于http://expressjs.com/api.html#bodyParser express.multipart() / connect.multipart()如何为所有上传的文件创建临时文件(并且不是垃圾回收),现在 security concern 不要使用express.bodyParser()包装器,而只使用您需要的中间件。

注意:{Connect}扩展后,connect.bodyParser()很快就会更新为仅包含urlencodedjson


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

app.use(express.bodyParser());

......你应该使用

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

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

答案 2 :(得分:80)

注意:此答案适用于Express 2.有关Express 3,请参阅here

如果您使用的是connect / express,则应使用bodyParser middlewareExpressjs guide中对此进行了描述。

// 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;;
    });
  })
);

使用Rails-style parameter handling (qs)而不是low-level querystring library来解析查询字符串和正文。为了使用qs解析重复参数,参数需要包含括号:name[]=val1&name[]=val2。它还支持嵌套映射。除了解析HTML表单提交外,bodyParser还可以自动解析JSON请求。

编辑:我读了express.js并修改了我的答案,以便对Express用户更自然。

答案 3 :(得分:29)

如果你想在没有中间件的情况下构建发布的查询,这将会这样做:

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

尽管使用中间件可能更好,所以你不必在每条路线中反复写这个。

答案 4 :(得分:23)

Express 4用户注意事项:

如果您尝试将app.use(express.bodyParser());放入应用程序,则在尝试启动Express服务器时会出现以下错误:

  

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

您必须单独安装软件包body-parser from npm,然后使用以下内容(示例来自the GitHub page):

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

答案 5 :(得分:18)

给出某种形式:

<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

答案 6 :(得分:14)

app.use(express.bodyParser());

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

答案 7 :(得分:14)

Express 4.4.1的更新

以下中间件已从Express中删除。

  • bodyParser
  • JS​​ON
  • urlencoded的

直接使用中间件,就像在Express 3.0中一样。您将收到以下错误:

Error: Most middleware (like urlencoded) is no longer bundled with Express and 
must be installed separately.


为了利用这些中间件,现在需要分别为每个中间件执行 npm

由于bodyParser被标记为已弃用,因此我建议使用json,urlencode和multipart解析器(如formidable,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);

答案 8 :(得分:13)

后端:

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

答案 9 :(得分:7)

对于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()处理application / x-www-form-urlencoded

multer()处理multipart / form-data

答案 10 :(得分:7)

我正在寻找这个确切的问题。我按照上面的所有建议,但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}

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

答案 11 :(得分:5)

你不应该使用 app.use(express.bodyParser())。 BodyParser是json + urlencoded + mulitpart的联合。你不应该使用它,因为multipart将在connect 3.0中删除。

要解决此问题,您可以执行以下操作:

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

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

答案 12 :(得分:4)

更新

Express version 4.16+起,默认的Express软件包中已包含他们自己的主体分析器实现,因此您无需下载其他依赖项。

您可能已经在代码中添加了一行,如下所示:

app.use(bodyparser.json()); //utilizes the body-parser package

如果您使用的是Express 4.16+,现在可以将该行替换为:

app.use(express.json()); //Used to parse JSON bodies

这不应给您的应用程序带来任何重大变化,因为express.json()中的代码基于bodyparser.json()。

如果您的环境中还包含以下代码:

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

您可以将其替换为:

app.use(express.urlencoded()); //Parse URL-encoded bodies

最后的警告注意:在某些非常特殊的情况下,可能仍需要body-parser,但是大多数情况下,您只需要Express的body-parser实现用例。

(有关更多详细信息,请参见expressjs/bodyparser上的文档)。

答案 13 :(得分:2)

请求流媒体为我工作

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

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

答案 14 :(得分:2)

我可以通过对 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));
    })

答案 15 :(得分:1)

B*H*W

答案 16 :(得分:1)

写于Express版本4.16

在路由器功能内,您可以使用req.body属性来访问post变量。例如,如果这是表单的POST路由,它将发送回您输入的内容:

function(req,res){
      res.send(req.body);

      //req.body.email would correspond with the HTML <input name="email"/>
}

P.S。对于那些熟悉PHP的人:为了访问PHP的$_GET变量,我们使用req.query,并访问PHP的$_POST变量,我们在Node.js中使用req.body

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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");
})

答案 19 :(得分:0)

你正在使用'req.query.post'和错误的方法'req.query.post'与'method = get'一起使用 'method = post'适用于body-parser。

只需通过更改帖子来获取

即可
<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'

答案 20 :(得分:0)

Express v4.17.0

app.use(express.urlencoded( {extended: true} ))

app.post('/userlogin', (req, res) => {    

   console.log(req.body) // object

   var email = req.body.email;

}

Demo Form

Another Answer Related

答案 21 :(得分:-1)

在HTML表单中使用POST方法时,您需要从服务器端req.body中捕获数据,即Node.js。 并添加

var bodyParser = require('body-parser')
app.use( bodyParser.json() );    
app.use(bodyParser.urlencoded({extended: false}));

OR

在HTML中使用method ='GET'并通过服务器端req.query捕获数据,即Node.js

答案 22 :(得分:-1)

来自official文档第4版

const express = require('express')
const app = express()
app.use(express.json());
app.use(express.urlencoded({ extended: true })) 

app.post('/push/send', (request, response) => {
  console.log(request.body)
})