次の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つのメソッドは実行されません。何故ですか?
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);
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()
})
JSONをテキストから解析するのに、サードパーティのライブラリが不要な場合があります。次のJSコマンドが必要な場合は、最初に試してください。
const res_data = JSON.parse(body);
const express = require('express');
let app = express();
app.use(express.json());
このapp.use(express.json)では、受信した投稿のJSONオブジェクトを読めるようになります。
req.body
で空のオブジェクトを取得している人のために
リクエストにheaders: {"Content-Type": "application/json"}
を設定するのを忘れていました。それを変更することで問題は解決しました。
@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);
});