Express4.17でreq.bodyがundefinedになる問題
2分目次
ExpressでPOSTしたデータ、要はreq.body
が取り出せなかった
何回トライしてもundefined
……
node……v14.15.0
Express……4.17.1
問題コード
import bodyParser from 'body-parser';
// 省略
// JSON
app.use(function (req: Request, res: Response, next: NextFunction) {
bodyParser.json();
next();
});
// POSTデータ整形
app.use(function (req: Request, res: Response, next: NextFunction) {
bodyParser.urlencoded({
extended: true
});
next();
});
app.use('/api/v1', hogeRouter);
// ...
リクエストにはPOSTMANを使っていて、cURL的には下記のような感じでPOSTしてた
curl --location --request POST 'http://localhost:8000/api/v1/user' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{
"uid": "test"
}'
エラー解消
解消に必要だったのは下記2点
- ESLintでbodyParserが非推奨と表示されたので修正する
next()
外す
これを適用したのが下記コード
// import bodyParser from 'body-parser'; // 不要
// 省略
// JSON
app.use(express.json());
// POSTデータ整形
// app.use(express.urlencoded({ // 不要
// extended: true
// }));
app.use('/api/v1', hogeRouter);
// ...
bodyParserはExpressに標準搭載されているため不要だった、それでESLintが反応してた
This middleware is available in Express v4.16.0 onwards. ref: http://expressjs.com/ja/api.html#express.json
また、urlencoded()
に関しては下記teratailが大変参考になった
Content-Typeがapplication/jsonのデータを取得する際には、express.json()だけで良いですが、Content-Typeがapplication/x-www-form-urlencodedのデータを取得するためにはexpress.urlencoded()を追加する必要があります。
ref: https://teratail.com/questions/280698
今回はAPI呼び出し側のアプリからのPOSTはJSON.stringfy()
を噛ませてるので不要だった
コードがだいぶスッキリした上にエラーも解消できた