web-dev-qa-db-ja.com

検索方法 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.emailsReq.query['email']sReq.params['email']などを試してみました。それらはすべてundefinedを返します。

Get呼び出しに変更しても動作します。

712
murvinlai

が変更されました もう一度 Express 4.16.0 から始まって、 Express 3.0 のようにexpress.json()express.urlencoded()を使うことができます。

これは 違う starting 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()にはセキュリティ上の問題があるため、必要な特定のエンコーディングタイプのサポートを明示的に追加することをお勧めします。もしあなたがマルチパートエンコーディング(例えばファイルのアップロードをサポートするために)を必要とするならば、あなたは これを読むべきです

1122
Drew Noakes

:この答えはExpress 2用です。Express 3用の here を参照してください。

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ライブラリ ではなく Railsスタイルのパラメータ処理(querystring を使用して解析されます。繰り返しパラメータをqsで解析するには、パラメータに括弧を付ける必要があります:name[]=val1&name[]=val2。ネストマップもサポートされています。 HTMLフォーム送信の解析に加えて、bodyParserはJSONリクエストを自動的に解析できます。

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

80
yonran

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()ラッパーを使用しないのはrecommended代わりに、必要なミドルウェアのみを使用してください。

注意:Connect 3.0がリリースされると(Expressが拡張する)、connect.bodyParser()urlencodedjsonのみを含むようにすぐに更新されます。


だから、要するに、の代わりに...

app.use(express.bodyParser());

...あなたは使うべきです

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

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

79
Sean Lynch

ミドルウェアなしで投稿されたクエリを構築したい場合、これはそれをします:

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

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

29
med116

Express 4ユーザーの場合の注意:

アプリにapp.use(express.bodyParser());を配置しようとすると、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();
})
24
mplewis

いくつかの形式を考えます。 

<form action='/somepath' method='post'>
   <input type='text' name='name'></input>
</form>

Expressを使う

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
18
David
app.use(express.bodyParser());

それからapp.postリクエストのためにあなたはreq.body.{post request variable}を通してpost値を得ることができます。

14

Express 4.4.1用のアップデート

以下のミドルウェアはExpressから削除されています。

  • bodyParser
  • ジョンソン
  • uRLエンコード
  • マルチパート

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);
14
yeelan

バックエンド:

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

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

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

7
cwingrav

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() アプリケーション/ jsonを処理します

connect.urlencoded() アプリケーションの処理/ x-www-form-urlencoded

multer() multipart/form-dataを処理する

7
Lalit Umbarkar

app.use(express.bodyParser()) を使わないでください。 BodyParserはjson + urlencoded + mulitpartの和集合です。 multipartはconnect 3.0で削除されるので、あなたはこれを使わないでください。

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

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

app.use(app.router) はjsonの後に使用し、urlencodeしてください。それ以外の場合は機能しません。

5
HenioJR

リクエストストリーミングは私のために働いた

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

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

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

2
ARUNBALAN NV

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

'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'を使用してください。

0
sagar saini
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");
})
0
seme