web-dev-qa-db-ja.com

JSONをどのように消費しますか POST Expressアプリケーションのデータ

次の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つのメソッドは実行されません。何故ですか?

250
neuromancer

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

responseオブジェクトはHTTPレスポンスを呼び出し側のクライアントに送り返すためのものですが、requestの本体にアクセスしたいのです。ガイダンスを提供している answer を参照してください。

有効な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);
379
Pero P.

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()
})
193
chrisarton

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

        const res_data = JSON.parse(body);
10
xims
const express = require('express');
let app = express();
app.use(express.json());

このapp.use(express.json)では、受信した投稿のJSONオブジェクトを読めるようになります。

3
SuRa

req.bodyで空のオブジェクトを取得している人のために

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

2
Daniel Thompson

@Daniel Thompsonは、彼が request に{"Content-Type": "application/json"}を追加するのを忘れていたと述べています。彼はリクエストを変更することができました、しかし、リクエストを変更することはいつも可能であるというわけではありません(我々はここでサーバに取り組んでいます)。

私の場合は、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);
});
0
anneb