ExpressアプリケーションでJSON POSTデータを使用する方法


307

次のJSON文字列をサーバーに送信しています。

(
        {
        id = 1;
        name = foo;
    },
        {
        id = 2;
        name = bar;
    }
)

サーバー上で私はこれを持っています。

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

    console.log("Got response: " + response.statusCode);

    response.on('data', function(chunk) {
        queryResponse+=chunk;
        console.log('data');
    });

    response.on('end', function(){
        console.log('end');
    });
});

文字列を送信すると、200応答が返されましたが、他の2つのメソッドは実行されません。何故ですか?

回答:


479

responseオブジェクトの使用との使用を融合していると思いますrequest

responseオブジェクトは、あなたがの体にアクセスするために欠けているのに対し、呼び出し元のクライアントにHTTPレスポンスバックを送信するためですrequest。いくつかのガイダンスを提供するこの回答を参照してください。

有効なJSONを使用していてContent-Type: application/json、それをPOSTしている場合は、bodyParserミドルウェアを使用してリクエストの本文を解析し、request.bodyルートに結果を配置できます。

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

app.use(express.bodyParser());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
  response.send(request.body);    // echo the result back
});

app.listen(3000);

次の行に沿ってテストします。

$ curl -d '{"MyKey":"My Value"}' -H "Content-Type: application/json" http://127.0.0.1:3000/
{"MyKey":"My Value"}

Express 4+用に更新

ボディパーサーは、v4の後で独自のnpmパッケージに分割されました。個別にインストールする必要があります npm install body-parser

var express = require('express')
  , bodyParser = require('body-parser');

var app = express();

app.use(bodyParser.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

Express 4.16以降のアップデート

リリース4.16.0以降、新しいexpress.json()ミドルウェアが利用可能です。

var express = require('express');

var app = express();

app.use(express.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

21
request.body.MyKey
Pero P.

5
連結がtoString()オブジェクトを呼び出すためです。のノードドキュメントを見てください。console.logこれは、オブジェクトを検査して文字列表現を返します。
Pero P.

13
console.log('request =' + JSON.stringify(request.body))
Pero P.

3
現在は、console.log()自動的にオブジェクト(経由を文字列化されますutil.inspect()、これは動作しますので、):console.log("with request", request.body);
トミー・スタントン

4
この回答は古くなっていますが、@ chrisartonからの回答は最新のものです。
Emil Ingerslev

209

Express v4 +の場合

npmからbody-parserをインストールします。

$ npm install body-parser

https://www.npmjs.org/package/body-parser#installation

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/json
app.use(bodyParser.json())

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next()
})

23
なぜ彼らは誰もが使用するものを取り出し続けるのですか?
light24bulbs 2014年

11
@ light24bulbsしたがって、(Express)はより無駄がなく、それを使用しない、または必要としない人にとって意味があります。
andyengle 2014年

6
@andyengle理にかなっています。しかし、事実上誰もがリクエスト解析を使用していると思います。それは私にとってコア機能のようです。
light24bulbs 2014年

23
ミドルウェア関数インターフェイスは多くのライブラリで使用されている標準であるため、Expressを使用しないアプリでもこれらのミドルウェア関数を使用できます。
Anm 2015年

3
Expressから取り出すと、リクエストを使用しないアプリで使用することはできません。彼らはそれを別々にして、それをデフォルトでエクスプレスに含めることもできました。
JJ

18

テキストからJSONを解析するためにサードパーティのライブラリが不要な場合があります。次のJSコマンドが必要な場合があります。最初に試してください。

        const res_data = JSON.parse(body);

3
元の質問は、ExpressフレームワークのPOSTメッセージからJSONを解析することです。BodyParserミドルウェアがない場合、JSONデータはリクエストオブジェクトのbodyプロパティに存在しません。
ThisClark、2016年

1
サーバーの応答を解析するときに、これが便利であることがわかりました。ありがとう!
Hasan Alsawadi 2016年

1
ハサンありがとう、コメントありがとうございます。解決策を探していて、この投稿に出くわしたとき、それは私を助けました。すべてのケースで機能するかどうかはわかりませんが、一部のケースでは確実に機能し、サードパーティのライブラリを使用するよりも優れたソリューションです。
xims 2016

1
あなたの回答とコメントは、より多くの情報を備えた回答を提供します(より多くの情報はここであなたの回答です)。回答を更新して、expressにbody-parserが必要であることを示すか、body-parserが最初にデータを取得した方法を示す代替案を提供する必要があります。
dewwwald 2016

2
定義しないbody
jameshfisher

15

空のオブジェクトを取得する人のために req.body

私はheaders: {"Content-Type": "application/json"} リクエストを設定するのを忘れてい ました。変更することで問題は解決しました。


これを見逃したなんて信じられない!私は一緒に送って、返事としてtext/json受け取り{}ました。私の全体的な監督。非常に役立ちます。
James M. Lay、

うーん、これも見逃した。これを投稿していただきありがとうございます。私が既に持っている以上の時間を無駄にしないようにしています!
スティーブゴメス

9

中:@Danielトンプソン氏は、{「アプリケーション/ jsonの」「のContent-Typeを」}追加することを忘れていたことに言及要求。彼はリクエストを変更できましたが、リクエストの変更が常に可能であるとは限りません(ここではサーバーで作業しています)。

私の場合、content-type:text / plainをjsonとして解析するように強制する必要がありました。

リクエストのコンテンツタイプを変更できない場合は、次のコードを使用してみてください。

app.use(express.json({type: '*/*'}));

グローバルにexpress.json()を使用する代わりに、たとえばPOSTリクエストなど、必要な場所にのみ適用することを好みます。

app.post('/mypost', express.json({type: '*/*'}), (req, res) => {
  // echo json
  res.json(req.body);
});

7

const express = require('express');
let app = express();
app.use(express.json());

このapp.use(express.json)により、受信したポストJSONオブジェクトを読み取ることができます

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