web-dev-qa-db-ja.com

Node.jsおよびExpressを使用してPOSTを実行するときにリクエスト本文にアクセスする方法

以下のNode.jsコードがあります。

var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());

app.post('/', function(request, response) {
    response.write(request.body.user);
    response.end();
});

今私がPOSTのようなものであれば:

curl -d user=Someone -H Accept:application/json --url http://localhost:5000

期待どおりにSomeoneが得られます。さて、完全なリクエストボディを取得したい場合はどうすればいいですか?私はresponse.write(request.body)を実行しようとしましたが、Node.jsは "最初の引数は文字列かBufferでなければなりません"と言う例外を投げ、そして "Can't送信後にヘッダを設定します。 ";私がvar reqBody = request.body;をしてからresponse.write(reqBody)を書いたとしてもこれは当てはまります。

ここの問題は何ですか?

また、express.bodyParser()を使わずに生のリクエストを受け取ることができますか?

132
TheBlueSky

Express 4.0以上

$ npm install --save body-parser

そしてあなたのノードアプリで:

const bodyParser = require('body-parser');
app.use(bodyParser);

Express 3.0以下

あなたのcURL呼び出しでこれを渡してみてください:

--header "Content-Type: application/json"

データがJSON形式であることを確認します。

{"user":"someone"}

次の例のように、node.jsコードでconsole.dirを使用してオブジェクト内のデータを確認することもできます。

var express = require('express');
var app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(req, res){
    console.dir(req.body);
    res.send("test");
}); 

app.listen(3000);

express node.js POST requestでJSONを受け取る方法

BodyParserを使用したくない場合は、この他の質問をチェックしてください。 https://stackoverflow.com/a/9920700/446681

122
Hector Correa

express v4.16から始めると、追加のモジュールを必要とする必要はありません。組み込みの JSONミドルウェアを使用するだけです

app.use(express.json())

このような:

const express = require('express')

app.use(express.json())    // <==== parse request body as JSON

app.listen(8080)

app.post('/test', (req, res) => {
  res.json({requestBody: req.body})  // <==== req.body will be a parsed JSON object
})

注 - これが依存するbody-parserは、expressにすでに含まれています。

またヘッダContent-Type: application/jsonを送ることを忘れないでください

77
rustyx

Express 4以降、次のコードがうまくいくようです。 npmを使ってbody-parserをインストールする必要があることに注意してください。

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


app.listen(8888);

app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});
40
Walter Roman
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())

var port = 9000;

app.post('/post/data', function(req, res) {
    console.log('receiving data...');
    console.log('body is ',req.body);
    res.send(req.body);
});

// start the server
app.listen(port);
console.log('Server started! At http://localhost:' + port);

これはあなたを助けるでしょう。私はあなたがjsonでボディを送っていると思います。

23
Gautam

これはbody-parserに依存せずに達成することもできます。request:datarequest:endをリ​​ッスンし、要求の終わりで応答を返します。以下のコードサンプルを参照してください。 ref: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body

var express = require('express');
var app = express.createServer(express.logger());

app.post('/', function(request, response) {

    // Push the data to body
    var body = [];
    request.on('data', (chunk) => {
      body.Push(chunk);
    }).on('end', () => {
      // on end of data, perform necessary action
      body = Buffer.concat(body).toString();
      response.write(request.body.user);
      response.end();
    });
});
5
Manivannan

これを試して:

response.write(JSON.stringify(request.body));

それはbodyParserがあなたのために作成したオブジェクトを受け取り、それを文字列に戻してそれをレスポンスに書き込みます。正確なリクエストボディ(同じ空白など)が必要な場合は、前にリクエストにdataおよびendリスナーを添付し、チャンクごとにチャンクごとに文字列を作成する必要があります。 json解析ソースコード)接続から

3
Peter Lyons

「やってみた」と主張するのは、curlでそれを起動したときに「期待どおりに」機能するコードに書いたものです。

発生しているエラーは、あなたが私たちに示したどのコードとも関連があるようには見えません。

生の要求を取得したい場合は、requestおよびdataイベントに対してendのハンドラを設定します(そしてもちろん、express.bodyParser()の呼び出しをすべて削除します)。 dataイベントはチャンクで発生します。dataイベントにエンコーディングを設定しない限り、それらのチャンクは文字列ではなくバッファになります。

1
ebohlman

2019では、body-parserをインストールする必要はありません。

次を使用できます。

var express = require('express');
var app = express();
app.use(express.json())
app.use(express.urlencoded({extended: true}))
app.listen(8888);
app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});
0
Shivam Gupta

あなたが投稿データの塊を読むのに十分に怠惰であれば。あなたは単にJSONを読むために行の下に貼り付けることができます。

以下はTypeScript用で、JSでも同様です。

app.ts

 import bodyParser from "body-parser";
 // support application/json type post data
 this.app.use(bodyParser.json());
 // support application/x-www-form-urlencoded post data
 this.app.use(bodyParser.urlencoded({ extended: false }));

以下のようにPOST callを受け取るあなたのいずれかのコントローラで

serController.ts

 public async POSTUser(_req: Request, _res: Response) {
   try {
          const onRecord = <UserModel>_req.body;
           /* Your business logic */
           _res.status(201).send("User Created");
        }
    else{
           _res.status(500).send("Server error");
           }        
   };

_req.bodyはあなたのTSモデルにjsonデータを解析しているはずです。

0
Shujaath Khan