なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

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

Git LFS のプロキシサーバーを Vercel に投げつけたんですが、そのとき req.bodyundefined だったので、その対処法としての方法を紹介します。
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;

簡単ですね。ということで今日のメモでした。