🚅

▲Vercel with Express.js - stream is not readable

2023/10/29に公開

context

Vercel上でExpressアプリを稼働させる。

Node.js: v18.15.0
express: v4.18.2
vercel: v32.4.1

How to Deploy an Express.js Application to Vercel

InternalServerError: stream is not readable

手元のMacで vercel dev にて稼働しているExpressサーバに対しPOSTリクエスト実行時にエラー。

api/index.js
app.use(express.json())
curl -X POST -d '{"foo":"bar"}' http://localhost:3000/api/hello
content-type application/x-www-form-urlencoded
req.body [Object: null prototype] { '{"foo":"bar"}': '' }
InternalServerError: stream is not readable

ローカルでエラーを解消するには

  • app.use(express.json())は不要。書くとストリームとして読もうとする。詳細は不明。
  • クライアント側でリクエストヘッダ "Content-Type: application/json" を付ける。
  • 付けないと content-type application/x-www-form-urlencoded と扱われる。

Vercel上だとエラー発生

  • req.body は undefined となる
  • app.use(express.json()) を書くとうまくいく

つまり、同じコードで別々の環境にて違う挙動となる。

対策

ローカル開発では vercel dev をやめて純粋な express アプリとしてサーバを起動する。

まとめ

vercel dev は信用ならない。

cf.

Express で application/json じゃないけど JSON で振ってくるものを良い感じにパースしたい | なつねこメモ

Discussion