以下の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();
});
今私がPOSTのようなものであれば:
curl -d user=Someone -H Accept:application/json --url http://localhost:5000
期待どおりにSomeone
が得られます。さて、完全なリクエストボディを取得したい場合はどうすればいいですか?私はresponse.write(request.body)
を実行しようとしましたが、Node.jsは "最初の引数は文字列かBufferでなければなりません"と言う例外を投げ、そして "Can't送信後にヘッダを設定します。 ";私がvar reqBody = request.body;
をしてからresponse.write(reqBody)
を書いたとしてもこれは当てはまります。
ここの問題は何ですか?
また、express.bodyParser()
を使わずに生のリクエストを受け取ることができますか?
$ npm install --save body-parser
そしてあなたのノードアプリで:
const bodyParser = require('body-parser');
app.use(bodyParser);
あなたの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);
express node.js POST requestでJSONを受け取る方法
BodyParserを使用したくない場合は、この他の質問をチェックしてください。 https://stackoverflow.com/a/9920700/446681
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
を送ることを忘れないでください
Express 4以降、次のコードがうまくいくようです。 npm
を使ってbody-parser
をインストールする必要があることに注意してください。
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
});
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でボディを送っていると思います。
これはbody-parser
に依存せずに達成することもできます。request:data
とrequest:end
をリッスンし、要求の終わりで応答を返します。以下のコードサンプルを参照してください。 ref: 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();
});
});
これを試して:
response.write(JSON.stringify(request.body));
それはbodyParser
があなたのために作成したオブジェクトを受け取り、それを文字列に戻してそれをレスポンスに書き込みます。正確なリクエストボディ(同じ空白など)が必要な場合は、前にリクエストにdata
およびend
リスナーを添付し、チャンクごとにチャンクごとに文字列を作成する必要があります。 json解析ソースコード)接続から 。
「やってみた」と主張するのは、curlでそれを起動したときに「期待どおりに」機能するコードに書いたものです。
発生しているエラーは、あなたが私たちに示したどのコードとも関連があるようには見えません。
生の要求を取得したい場合は、request
およびdata
イベントに対してend
のハンドラを設定します(そしてもちろん、express.bodyParser()
の呼び出しをすべて削除します)。 data
イベントはチャンクで発生します。data
イベントにエンコーディングを設定しない限り、それらのチャンクは文字列ではなくバッファになります。
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
});
あなたが投稿データの塊を読むのに十分に怠惰であれば。あなたは単に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 callを受け取るあなたのいずれかのコントローラで
serController.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はあなたのTSモデルにjsonデータを解析しているはずです。