🔥

【NodeJS12→16移行時にハマったエラー】request size did not match content length

2022/11/22に公開

まえがき

NodeJS12→16移行した際に、expressに対してのPOSTリクエストが失敗するようになってしまった。その時のエラーログが↓。

BadRequestError: request size did not match content length

raw-bodyでHTTPリクエストを処理している際に
・リクエストヘッダのContent-Lengthヘッダに格納されている値
・実際に送られたリクエストのサイズ
が等しくない場合に、このエラーが発生する。該当ソースはこちら

原因

先に結論をいうと、expressを定義しているモジュールの先頭に↓の記載をしていたことがNGだった。

process.binding('http_parser').HTTPParser = require('http-parser-js').HTTPParser;

const express = require('express');
// --------

process.binding()とは、NodeJSの内部モジュールを参照する関数。
ここではNodeJSの標準HTTPパーサであるhttp_parserを参照し、これをhttp-parser-jsに置き換えている。置き換えている理由は↓の記事を参照。

https://zenn.dev/crsc1206/articles/b8c358c77c0bbb#lecay-http-parserとは

NodeJSの標準HTTPパーサ「http_parser」はNode13で廃止。

↓の記事にある通り、Node13より標準パーサは「http_parser」→「llhttp」に移行されている。

https://zenn.dev/articles/b8c358c77c0bbb

なので、「http_parser」の利用を前提としている↓は、Node13より不要なのだ。

process.binding('http_parser').HTTPParser = require('http-parser-js').HTTPParser;

↑の記述を消せば、Node16環境でexpressがPOSTリクエストを正常に受け付けることを確認できた。

Discussion