🐛
[NestJS] bodyで受け取ったbooleanの値が正しくパースされない問題と解決策
事象
NestJSでmultipart/form-data
でリクエストを受け取った際に、boolean
の値が正しくパースされない問題があります。
具体的には、false
の値がtrue
としてパースされてしまいます。(というかtrue
にしかなりません)
該当する環境
-
ValidationPipe
を使用しており、enableImplicitConversion: true
になっている -
class-transformer
を使用している(執筆時の最新バージョンは0.5.1
)
結論
class-transformer
が原因です。
multipart/form-data
ではパラメータをstring
として受け取るのですが、string
->boolean
の変換に対応していません。
現時点(6/27)PRが出ていますがマージされておらず。
解決策
class-transformer
は2021年頃からメンテナンスが停止しているようです。
なので今回はclass-transformer
をforkして修正を行いました。
使用方法
- (任意)
class-transformer
をアンインストール
インストールしたままでも良いですが、 機能的にはclass-transformer
と同じなので自分はアンインストールしました。
インポート先をclass-transformer
から@takecchi/class-transformer
に変更するだけです。
npm uninstall class-transformer
-
@takecchi/class-transformer
をインストール
npm install @takecchi/class-transformer
-
transformerPackage
で@takecchi/class-transformer
を指定する
app.useGlobalPipes(
new ValidationPipe({
transformerPackage: require('@takecchi/class-transformer'),
transform: true,
transformOptions: { enableImplicitConversion: true },
}),
);
まとめ
この結論に至るまでに再現リポジトリを作ったり、NestJSのソースコードを読んだりしたので、
本当はその話も書こうと思っていたのですが、結論書いたら不要な気がしたので割愛しました。
気になる人向けに再現リポジトリだけ置いておきます。
Discussion