如何检索POST查询参数?

mur*_*lai 746 javascript post node.js 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>
Run Code Online (Sandbox Code Playgroud)

这是我的Express.js /Node.js代码:

app.post('/userlogin', function(sReq, sRes){    
    var email = sReq.query.email.;   
}
Run Code Online (Sandbox Code Playgroud)

我试过sReq.query.emailsReq.query['email']sReq.params['email']等他们都没有工作.他们都回来了undefined.

当我改为Get电话时,它有效,所以..任何想法?

Dre*_*kes 1211

事情已经改变,再次启动Express 4.16.0,你现在可以使用express.json(),express.urlencoded()就像在Express 3.0中一样.

这是不同的首发快递4.0至4.15:

$ npm install --save body-parser
Run Code Online (Sandbox Code Playgroud)

然后:

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
})); 
Run Code Online (Sandbox Code Playgroud)

其余的就像在Express 3.0中一样:

首先,您需要添加一些中间件来解析正文的帖子数据.

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

app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies
Run Code Online (Sandbox Code Playgroud)

然后,在您的处理程序中,使用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;
    // ...
});
Run Code Online (Sandbox Code Playgroud)

请注意,express.bodyParser()不建议使用.

app.use(express.bodyParser());
Run Code Online (Sandbox Code Playgroud)

......相当于:

app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());
Run Code Online (Sandbox Code Playgroud)

存在安全问题express.multipart(),因此最好明确添加对所需特定编码类型的支持.如果您确实需要多部分编码(例如,支持上传文件),那么您应该阅读此内容.

  • 如果这个答案不正常,请确保你设置了`content-type`标题,例如:`curl -d'{"good_food":["pizza"]}'-H'content-type:application/json'"http://www.example.com/your_endpoint"` (73认同)
  • 为了使用Express 4读取json,只有`app.use(require('body-parser').json())`行就足够了.然后,您可以从路径定义中读取请求的正文对象(即"req.body")中的json数据. (11认同)
  • @chovy是的,他们这样做.`bodyParser`将JSON,URL编码和多部分数据抽象为`req.body`对象. (7认同)
  • 这段代码给了我错误,因为中间件不再与Express捆绑在一起; 你必须使用body-parser:https://github.com/senchalabs/connect#middleware (7认同)
  • 发布具有名称/值对的表单和发布JSON正文之间有什么区别?他们俩都出现在req.body中吗? (5认同)
  • 我试图理解为什么`JSON.parse('{'+ params.split('=').join(':').split('&').join(',')+'}') ;`需要成为它自己独立的中间件组件,而不是Express.js开箱即用的东西.如何筛选现在的几十个依赖项,使最简单的事情发生比使用http.listen更容易? (2认同)
  • 你已经在告诉明确使用什么了.省略以下内容,它会正常工作.app.use(express.json()); //支持JSON编码的主体app.use(express.urlencoded()); //支持URL编码的主体 (2认同)

Sea*_*nch 86

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

而所有其他的答案目前推荐使用的express.bodyParser()中间件,这其实是围绕着一个包装express.json(),express.urlencoded()express.multipart()中间件(http://expressjs.com/api.html#bodyParser).表单请求主体的解析由express.urlencoded()中间件完成,是您在req.body对象上公开表单数据所需的全部内容.

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

注意:connect.bodyParser()很快将更新为仅包含urlencodedjson何时发布Connect 3.0(Express扩展).


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

app.use(express.bodyParser());
Run Code Online (Sandbox Code Playgroud)

......你应该用

app.use(express.urlencoded());
app.use(express.json());      // if needed
Run Code Online (Sandbox Code Playgroud)

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

  • app.use(express.urlencoded()); 现在有效 (2认同)

yon*_*ran 82

注意:这个答案适用于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
});
Run Code Online (Sandbox Code Playgroud)

这是原始的仅连接版本:

// 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;;
    });
  })
);
Run Code Online (Sandbox Code Playgroud)

使用Rails样式的参数handling(qs)而不是低级querystring来解析查询字符串和正文.为了解析重复的参数qs,参数需要有括号:name[]=val1&name[]=val2.它还支持嵌套映射.除了解析HTML表单提交之外,bodyParser还可以自动解析JSON请求.

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

  • 不,req.query只是GET参数.您通过req.body获取POST数据.函数req.params()包括它们. (3认同)

med*_*116 31

如果您想在没有中间件的情况下构建已发布的查询,这将执行此操作:

app.post("/register/",function(req,res){
    var bodyStr = '';
    req.on("data",function(chunk){
        bodyStr += chunk.toString();
    });
    req.on("end",function(){
        res.send(bodyStr);
    });

});
Run Code Online (Sandbox Code Playgroud)

这将把它发送到浏览器

email=emailval&password1=pass1val&password2=pass2val
Run Code Online (Sandbox Code Playgroud)

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

  • sooo ....方便,对于那些不想依赖于迟早会被弃用的库的人 (3认同)

mpl*_*wis 24

Express 4用户注意事项:

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

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

您必须从npmbody-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();
})
Run Code Online (Sandbox Code Playgroud)


小智 18

给定一些形式:

<form action='/somepath' method='post'>
   <input type='text' name='name'></input>
</form>
Run Code Online (Sandbox Code Playgroud)

使用快递

app.post('/somepath', function(req, res) {

    console.log(JSON.stringify(req.body));

    console.log('req.body.name', req.body['name']);
});
Run Code Online (Sandbox Code Playgroud)

输出:

{"name":"x","description":"x"}
req.param.name x
Run Code Online (Sandbox Code Playgroud)

  • 没有为我工作.需要使用app.use(express.bodyParser()); (6认同)

Chi*_*aka 14

app.use(express.bodyParser());
Run Code Online (Sandbox Code Playgroud)

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

  • express.bodyParser()已弃用.更新你的答案 (2认同)

yee*_*lan 14

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.
Run Code Online (Sandbox Code Playgroud)


为了利用这些中间件,现在你需要分别为每个中间件做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);
Run Code Online (Sandbox Code Playgroud)


lak*_*are 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);
});
Run Code Online (Sandbox Code Playgroud)

前端:

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
});
Run Code Online (Sandbox Code Playgroud)


Shi*_*Jha 8

更新

Express version 4.16+.

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

app.use(bodyparser.json()); //utilizes the body-parser package
Run Code Online (Sandbox Code Playgroud)

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

app.use(express.json()); //Used to parse JSON bodies
Run Code Online (Sandbox Code Playgroud)

由于 express.json() 中的代码基于 bodyparser.json(),因此这不应在您的应用程序中引入任何破坏性更改。

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

app.use(bodyParser.urlencoded({extended: true}));
Run Code Online (Sandbox Code Playgroud)

您可以将其替换为:

app.use(express.urlencoded()); //Parse URL-encoded bodies
Run Code Online (Sandbox Code Playgroud)

最后要注意的是:仍然有一些非常特殊的情况body-parser可能仍然是必要的,但在大多数Express情况下,body-parser 的实现是大多数用例所需要的。

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


Lal*_*kar 7

适用于Express 4.1及以上版本

由于大多数答案都用于Express,bodyParser,connect; 不推荐使用multipart的地方.有一种安全的方式可以轻松发送多部分对象.

Multer可以用作connect.multipart()的替代品.

安装包

$ npm install multer
Run Code Online (Sandbox Code Playgroud)

将其加载到您的应用中:

var multer = require('multer');
Run Code Online (Sandbox Code Playgroud)

然后,将其与其他表单解析中间件一起添加到中间件堆栈中.

app.use(express.json());
app.use(express.urlencoded());
app.use(multer({ dest: './uploads/' }));
Run Code Online (Sandbox Code Playgroud)

connect.json()处理application/json

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

multer()处理multipart/form-data


cwi*_*rav 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}
Run Code Online (Sandbox Code Playgroud)

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


Hen*_*oJR 5

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

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

app.use(express.json());
app.use(express.urlencoded());
Run Code Online (Sandbox Code Playgroud)

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


小智 5

请求流对我有用

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

var postdata = "";
req.on('data', function(postdataChunk){
    postdata += postdataChunk;
});
Run Code Online (Sandbox Code Playgroud)

  • 比执行 `postdata.split("&amp;")` 更好的方法是加载核心模块 `querystring = require('querystring')`,然后用 `querystring.parse(postdata)` 解析您的 `postdata`; (2认同)

Log*_*gan 5

写于 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"/>
}
Run Code Online (Sandbox Code Playgroud)

给熟悉 PHP 的人 PS:为了访问$_GET我们使用的PHP变量,req.query以及访问$_POST我们req.body在 Node.js 中使用的PHP变量。


ant*_*ove 5

快递 v4.17.0

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

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

   console.log(req.body) // object

   var email = req.body.email;

}
Run Code Online (Sandbox Code Playgroud)

演示表格

另一个答案相关

  • 设置扩展为 true 的目的是什么?这意味着什么? (2认同)