1. ホーム
  2. node.js

[解決済み] 投稿時にreq.bodyが空になる

2022-02-14 16:25:23

質問

突然ですが、この現象が私のすべてのプロジェクトで起こっています。

nodejsでexpressとbody-parserを使って投稿するたびに req.body は空のオブジェクトです。

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

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())

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

app.listen(2000);

app.post("/", function (req, res) {
  console.log(req.body) // populated!
  res.send(200, req.body);
});

ajaxとpostmanを経由すると、常に空です。

ただし、curl経由

$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/

意図したとおりに動作します。

手動で設定してみた Content-type : application/json を表示させることができますが、その場合は必ず 400 bad request

これで気が狂いそうです。

body-parserの何かが更新されたのかと思いましたが、ダウングレードしてもダメでした。

何かお手伝いできることがあれば、よろしくお願いします。

解決方法は?

Postmanでcontent typeの3つのオプションから "X-www-form-urlencoded" を選択すると、うまくいくはずです。

また、エラーメッセージをなくすには、置換してください。

app.use(bodyParser.urlencoded())

とともに。

app.use(bodyParser.urlencoded({
  extended: true
}));

参照 https://github.com/expressjs/body-parser

body-parser' ミドルウェアは JSON と urlencode されたデータのみを扱い、マルチパートは扱いません。

SujeetAgrahari が言及したように、body-parser は現在 express.js に内蔵されています。

使用方法 app.use(express.json()); を使用して、最近のバージョンではJSONボディ用に実装されています。URLエンコードされたボディ(HTTPフォームのPOSTで生成されるようなもの)には app.use(express.urlencoded());