249

私は次の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();
});

今、私が次のようなものを投稿した場合:

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

期待通りになりSomeoneます。では、リクエストの本文全体を取得したい場合はどうすればよいですか?試してみresponse.write(request.body)ましたが、Node.jsは「最初の引数は文字列またはバッファである必要があります」という例外をスローし、「送信後にヘッダーを設定できません」という例外を除いて「無限ループ」になります。var reqBody = request.body;これは、私が行ってから書いたとしても当てはまりますresponse.write(reqBody)

ここでの問題は何ですか?

また、使用せずに生のリクエストを取得することはできexpress.bodyParser()ますか?

4

15 に答える 15

328

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

于 2018-04-20T14:19:58.823 に答える
197

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

この他の質問も役立つかもしれません:エクスプレスnode.js POSTリクエストでJSONを受信する方法は?

bodyParserを使用したくない場合は、次の別の質問を確認してください:https ://stackoverflow.com/a/9920700/446681

于 2012-07-24T13:14:20.610 に答える
44

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

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
});
于 2015-04-24T03:18:40.147 に答える
32

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
});
于 2019-08-01T10:09:31.300 に答える
25
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で本文を送信していると思います。

于 2017-05-10T10:11:11.043 に答える
20

body-parser非推奨になっているため、使用しないでください。代わりにこれを試してください

const express = require('express')
const app = express()

app.use(express.json()) //Notice express.json middleware

このapp.use()関数は、指定されているパスに指定されたミドルウェア関数をマウントするために使用されます。これは主に、アプリケーションのミドルウェアをセットアップするために使用されます。

本体にアクセスするには、次の手順を実行します

app.post('/', (req, res) => {
  console.log(req.body)
})

于 2021-03-26T15:45:34.333 に答える
10

これはbody-parser、依存関係なしでも実現できます。リクエストの終了時に応答をリッスンしrequest:datarequest:end返します。以下のコードサンプルを参照してください。参照: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();
    });
});
于 2018-07-10T16:24:06.840 に答える
6

私の場合、ヘッダーを設定することができませんでした:

"Content-Type: application/json"

于 2020-08-31T18:37:02.530 に答える
4

これを試して:

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

これにより、作成されたオブジェクトが取得bodyParserされ、文字列に戻されて応答に書き込まれます。正確なリクエスト本文(同じ空白など)が必要な場合は、事前にリクエストdataにリスナーをアタッチし、 connectからのjson解析ソースコードendでわかるように、チャンクごとに文字列を構築する必要があります。

于 2012-07-24T13:15:25.947 に答える
2

投稿データのチャンクを読み取るのに十分怠惰な場合。行の下に貼り付けるだけで、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呼び出しを受信する任意のコントローラーの1つで使用します

userController.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は、jsonデータをTSモデルに解析する必要があります。

于 2019-02-27T08:13:08.530 に答える
2

私はJSとESにまったく慣れていませんが、私にとってうまくいくように見えるのはこれだけです。

JSON.stringify(req.body)

何か問題があれば教えてください!

于 2019-12-18T11:32:58.847 に答える
1

「やってみた」と主張するのは、curlを使用して呼び出したときに「期待どおりに」機能するコードに記述したものとまったく同じです。

発生しているエラーは、表示されているコードのいずれにも関連していないようです。

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

于 2012-07-24T10:53:57.120 に答える
1

以下のコマンドでBodyParserをインストールします

$ npm install --save body-parser

ボディパーサーの構成

const bodyParser = require('body-parser');
app.use(bodyParser);
app.use(bodyParser.json()); //Make sure u have added this line
app.use(bodyParser.urlencoded({ extended: false }));
于 2020-05-10T03:24:10.410 に答える
1

受け入れられた回答は、JSON形式と互換性のある本文でのみ機能します。一般的に、ボディはを使用してアクセスできます

app.use(
  Express.raw({
    inflate: true,
    limit: '50mb',
    type: () => true, // this matches all content types
  })
);

ここに投稿されたように。req.bodyにはタイプBufferがあり、目的の形式に変換できます。

たとえば、次の方法で文字列に変換します。

let body = req.body.toString()

または、次の方法でJSONに変換します。

let body = req.body.toJSON();
于 2021-10-18T10:58:45.453 に答える
-3

次のコードを使用して、投稿データをログに記録します。

router.post("/users",function(req,res){
    res.send(JSON.stringify(req.body, null, 4));
});
于 2016-09-09T04:32:20.000 に答える