🚅
▲Vercel with Express.js - stream is not readable
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