361

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

4

7 に答える 7

624

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

responseオブジェクトは、HTTP応答を呼び出し元のクライアントに送り返すためのものですが、の本文にアクセスする必要がありますrequest。いくつかのガイダンスを提供するこの回答を参照してください。

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

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

Express4.0用に更新-4.15

ボディパーサーは、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)の場合

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"}
于 2012-04-04T08:33:16.283 に答える
220

Expressv4+の場合

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()
})
于 2014-07-08T15:05:25.977 に答える
42

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

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

于 2019-01-10T03:10:50.720 に答える
19

@Daniel Thompsonは、リクエストに{"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);
});
于 2019-04-17T10:18:01.200 に答える
17

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

        const res_data = JSON.parse(body);
于 2016-07-21T03:29:17.870 に答える
16

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

このapp.use(express.json)を使用すると、受信した投稿のJSONオブジェクトを読み取ることができます。

于 2019-03-26T19:18:38.583 に答える
1

初心者の間違い...私はメインファイル(エントリポイント)の代わりにローカルモジュールapp.use(express.json());で使用していました。

于 2021-02-25T16:19:51.737 に答える