Git LFS のプロキシサーバーを Vercel に投げつけたんですが、そのとき req.body
が undefined
だったので、その対処法としての方法を紹介します。
Express (Vercel) を使ってる場合、 app.use(express.json())
で JSON に対応できるようになっています。
しかし、これは Content-Type
ヘッダーを見ているのか、例えば以下のような Content-Type
の場合は JSON としてパースされません。
Content-Type: application/vnd.git-lfs+json
これは Git LFS のクライアントが投げる Content-Type および Accept ヘッダーで、まぁ要するに JSON なんですが、上記のミドルウェア設定では対応していないので、自前でパースする必要があります。
ということで、それは以下のようなコードで対応が可能です。
const readAsJson = async (req: VercelRequest): Promise<string> => { const body: Uint8Array[] = []; return new Promise((resolve, reject) => { req.on("data", (chunk) => { body.push(chunk); }); req.on("end", () => { resolve(Buffer.concat(body).toString()); }); req.on("error", () => reject())); }); }; const handler = async (req: VercelRequest, res: VercelResponse) => { if (req.method === "POST") { const jsonStr = await readAsJson(req); } }; export default handler;
簡単ですね。ということで今日のメモでした。