LoginSignup
8
5

More than 3 years have passed since last update.

expressで、req.bodyがundefined になる件の解消

Last updated at Posted at 2020-12-22

エラー

① body-parser未指定

これは、あるpostリクエストで走る処理です。

controller.ts
routeAction: async (req: Express.Request, res: Express.Response) => {
    console.log(req.body) // undefinedが返る。。
}

適切なbodyを込めてpostリクエストすると、以下のようなエラーが。
(node:42936) UnhandledPromiseRejectionWarning: ValidationError: set validation failed: title: Path title is required.
(個人的に)必須設定にしていたtitleパラメータがbodyに入ってないよ、と言われたので、じゃあ何が入ってるんだとreq.bodyを出力してみると、
なんとreq.body自体がundefined..
適切なbodyをリクエストで込めているのに。

②body-parser指定したが、指定タイミングミス

https://expressjs.com/en/4x/api.html#req.body
恐らくexpressで受け取れる形でリクエストに込めたbodyがうまくパースされて無いのではということで、
expressにbody-parse設定してみたが解決せず。.

main.ts
import Express from 'express'

const app = Express();// create server
app.use('/', routeAction);// パス指定
// この行を追記
app.use(Express.json());// body-parser settings

// start server
const port = 3000;
app.listen(port, () => {
    console.log('server start');
});

解決方法: body-parserをパスより前に指定する。

どうやら、パース設定はパス指定時に確定されてしまうようでした。
ということで、パス指定前にbody-parserを設定することで解決。
ドキュメントから根拠は探せてはいないのですが。。

main.ts
import Express from 'express'

const app = Express();// create server
// パス指定より前に指定する。
app.use(Express.json());// body-parser settings
app.use('/', routeAction);// パス指定

// start server
const port = 3000;
app.listen(port, () => {
    console.log('server start');
});
8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5