🔥
【NodeJS12→16移行時にハマったエラー】request size did not match content length
まえがき
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
に置き換えている。置き換えている理由は↓の記事を参照。
NodeJSの標準HTTPパーサ「http_parser」はNode13で廃止。
↓の記事にある通り、Node13より標準パーサは「http_parser」→「llhttp」に移行されている。
なので、「http_parser」の利用を前提としている↓は、Node13より不要なのだ。
process.binding('http_parser').HTTPParser = require('http-parser-js').HTTPParser;
↑の記述を消せば、Node16環境でexpressがPOSTリクエストを正常に受け付けることを確認できた。
Discussion