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()を噛ませてるので不要だった

コードがだいぶスッキリした上にエラーも解消できた

  • SNSでシェアしよう
  • Twitterでシェア
  • FaceBookでシェア
  • Lineでシェア
  • 記事タイトルとURLをコピー
トップへ戻るボタン

\ HOME /

トップへ戻る