POSTクエリパラメータを取得する方法


768

これが私の簡単なフォームです:

<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呼び出しに変更すると機能するので、..アイデアはありますか?


33
セキュリティbodyParser()ここの回答から使用しているすべての人は、以下の
@SeanLynch

body-parserモジュールを使用します。body-parserの便利な使用例をいくつか示します
drorw

回答:


1251

物事は持っています Express 4.16.0以降、再び変更され、Express 3.0express.json()express.urlencoded()同様に使用できるようになりました。

これはだっ異なる開始4.15へのエクスプレス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と同じです。

まず、本文の投稿データを解析するミドルウェアを追加する必要があります。

次のコード行の1つまたは両方を追加します。

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()ため、必要な特定のエンコーディングタイプのサポートを明示的に追加することをお勧めします。(たとえば、ファイルのアップロードをサポートするために)マルチパートエンコーディングが必要な場合は、これを読みください


76
この答えが正しい動作しない場合は、必ず持たせるcontent-type例えば、ヘッダセットを:curl -d '{"good_food":["pizza"]}' -H 'content-type:application/json' "http://www.example.com/your_endpoint"
SooDesuNe

6
名前と値のペアを含むフォームの投稿とJSON本文の投稿の違いは何ですか?両方ともreq.bodyに表示されますか?
チョビー

7
@chovyはい、そうです。bodyParserJSON、URLエンコード、マルチパートデータをreq.bodyオブジェクトに抽象化します。
Kristján

7
ミドルウェアはExpressにバンドルされなくなったため、このコードではエラーが発生しました。body-parserを使用する必要があります:github.com/senchalabs/connect#middleware
araneae '13

11
Express 4を使用してjsonを読み取るには、app.use(require('body-parser').json())行のみで十分です。そして、リクエストのbodyオブジェクトreq.bodyから、つまりルート定義内からjsonデータを読み取ることができます。
Martin Carel 14年

90

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接続3.0は(エクスプレスが延びる)にリリースされたとき。


要するに、代わりに...

app.use(express.bodyParser());

...使用する必要があります

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

マルチパートフォーム(ファイルのアップロード)を処理する必要がある場合は、サードパーティのライブラリまたはミドルウェア(マルチパーティ、バスボーイ、ダイサーなど)を使用します。


質問の下にコメントを追加して、より多くの人にあなたの懸念やアドバイスを見てもらいましょう。Andrew Kelleyのブログ投稿に詳細が記載されている他の解決策は、あなたの意見に(まだ)関連していますか?(他の人に尋ねるだけで、私のニーズは純粋に内部ツールです^^)
FelipeAls 2013年

@FelipeAls-はい、そして私はAndrewの投稿も参照するつもりでした。これらの提案のいずれか(それぞれの欠点を考慮に入れて)が関連します。
ショーンリンチ

また、Connect 3.0がリリースされたら、 multipart()一部としてれるとbodyParser()bodyParser()再び「安全」になりますが、サードパーティのライブラリを使用してマルチパートサポートを明示的に有効にする必要があります。
Sean Lynch

84

:この回答はExpress 2を対象としています。Express3についてはこちらをご覧ください。

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

クエリ文字列と本文の両方が次を使用して解析されます qsが、低レベルquerystringライブラリではなくRailsスタイルのパラメーター処理(ます。で繰り返しパラメータを解析するにqsは、パラメータに角かっこが必要ですname[]=val1&name[]=val2。ネストされたマップもサポートしています。HTMLフォーム送信の解析に加えて、bodyParserはJSONリクエストを自動的に解析できます。

編集:私はexpress.jsを読み、Expressのユーザーにとってより自然なものになるように私の答えを変更しました。


なるほど。bodyParser()を試します。ドキュメントにはreq.query()から取得できると記載されていますが、何も取得できません。それは非常に奇妙です。Get thoには問題ありません。
murvinlai

3
いいえ、req.queryはGETパラメータのみです。req.bodyを通じてPOSTデータを取得します。関数req.params()には、両方が含まれています。
yonran

誤ったクリックで、知らないうちに誤ってこの回答に投票した!今、StackOverflowはそれを変更させません。特に これは役に立ったのでイライラしました...私はそれを補うために明確に探していなかったあなたの良い答えの別のものを賛成しました。:)
HostileForkはSEを信頼しないと

33

ミドルウェアなしで投稿されたクエリを作成したい場合は、次のようにします。

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

おそらくミドルウェアを使用する方が良いので、各ルートでこれを何度も何度も書く必要はありません。


3
sooo ....便利です、遅かれ早かれ廃止されるライブラリに依存したくない人のために
Daniel

独自のミドルウェアを簡単に構築できます
maioman 2016年

これは素晴らしい答えですが、なぜ「--------------- 359856253150893337905494 Content-Disposition:form-data; name」という余分なテキストがあるのですか= "fullName" Ram ---------------------------- 359856253150893337905494-- "その番号は必要ありません。
Nawaraj

25

Express 4ユーザーへの注意:

あなたがしようと置けばapp.use(express.bodyParser());、あなたのアプリにあなたのExpressサーバを起動しようとすると、次のエラーを取得します:

エラー:ほとんどのミドルウェア(bodyParserなど)はExpressにバンドルされなくなったため、個別にインストールする必要があります。参照してくださいhttps://github.com/senchalabs/connect#middlewareを

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

この情報をありがとうございました。bodyParserの新しい使用方法に対処しようとして、髪を引っ張っていました。これは大きな進歩でした-本当に感謝しています
トミー

1
heplp:body-parserは非推奨のbodyParser:個別のjson / urlencodedミドルウェアを使用
Mohammad Faizan khan '29

19

いくつかの形を考えると:

<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
うまくいきませんでした。app.use(express.bodyParser());を使用する必要があります。
cawecoy 2013年

@cawecoyはここでもまったく同じですが、express.bodyParser()が機能しないので非推奨
Mohammad Faizan khan '29

@MohammadFaizankhanそれは実験的な作品でした、私はもうエクスプレスを使用しませんでした、今は仕方ありません。同様の関数でGoogleを表現して、express.bodyParser()を実行します。幸運を祈ります!
cawecoy 2014年

16

バックエンド:

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

15
app.use(express.bodyParser());

次に、app.postリクエストでを介して投稿値を取得できますreq.body.{post request variable}


ここでの投稿リクエスト変数は、問題の入力フィールドのIDか、フォーム全体か、それとも何ですか?
Eogcloud 2014年

2
express.bodyParser()は非推奨です。答えを更新してください
Mohammad Faizan khan 2014

15

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、および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);

これは本当に悪い機能の更新だと思います
Mohammad Faizan khan '29

ボディパースのために、たくさんのコードを実行する必要があります。ハックとは何か
Mohammad Faizan khan、2014

1
これを機能させるには、require( 'json-middleware')に ".middleware()"を追加する必要がありました。
DustinB 2014年

8

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を処理します


8

私はこの正確な問題を探していました。上記のすべてのアドバイスに従いましたが、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}

私のばか間違いはあなたの利益です。


ここでも同じ問題。しかし、私は最初からname属性を使用していました。問題が何であるか見てみましょう。
サイフアルファラー2017年

6

app.use(express.bodyParser())を使用しないでください。BodyParserは、json + urlencoded + mulitpartの和集合です。マルチパートは接続3.0で削除されるため、これを使用しないでください。

これを解決するには、次のようにします。

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

app.use(app.router)はjsonの後に使用してurlencodeする必要があることを知っておくことが非常に重要です。それ以外の場合は機能しません。


4

ストリーミングのリクエストは私にとってはうまくいった

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

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

1
やってより良いはpostdata.split("&")コアモジュールをロードすることであろうquerystring = require('querystring')と、あなたのを解析するpostdataquerystring.parse(postdata)
John Slegers 2016年

4

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

Expressのバージョンで回答を更新してもよろしいですか?
lfender6445 2017年

3

Expressバージョン4.16で作成

router関数内では、req.bodyプロパティを使用してpost変数にアクセスできます。たとえば、これがPOSTフォームのルートの場合、入力した内容が返されます。

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

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

PHPに慣れている方のためのPS:$_GET私たちが使用req.queryするPHPの$_POST変数にアクセスするため、およびreq.bodyNode.jsで使用するPHPの変数にアクセスするため。


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

1

Postパラメータは次のようにして取得できます。

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

2
これが機能しないことに気づきましたか?paramGETリクエストに使用されます。POSTではなく、例に詳細が欠けているため、新規参入者を混乱させます。その上、request.param実際には非推奨であるため、あなたの例は非常に多くのレベルで間違っています。
vdegenne 2018

0

あなたはreq.query.post間違った方法で使用していますでreq.query.post動作し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」を使用します


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');
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.