要旨
JSON形式のリクエストボディについてexpress-validator
でデータ型をチェックする場合、以下のようにvalidatorを実装する。
{
"string": "abc",
"int": 123,
"float": 123.456,
"boolean": true,
"object": { "key": "value" },
"array": ["a", "b", "c"]
}
[
// 文字列
body('string').isString(),
// 数値(整数)
body('int').isInt().not().isString(),
// 数値(浮動小数点数)
body('float').isFloat().not().isString(),
// 真偽値
body('boolean').isBoolean({ strict: true }),
// オブジェクト
body('object').isObject(),
// 配列
body('array').isArray(),
]
詳説
express-validator
でデータ型をチェックする場合、数値および真偽値については注意する。Validation Chain APIには.isInt()
, isFloat()
, .isBoolean()
などのメソッドが用意されているが、そのまま使用すると意図しない値まで許容してしまう可能性がある。なお、文字列、オブジェクト、配列については注意する必要がないため本項では特に扱わない。
数値
.isInt()
およびisFloat()
は、データ型が文字列であっても内容が数値であれば許容する。データ型として数値だけを許容したい場合は、.not().isString()
を追加して文字列でないことをチェックする。
// 数値(整数)
body('int').isInt().not().isString(),
// 数値(浮動小数点数)
body('float').isFloat().not().isString(),
もし、意図せずに文字列である数値を許容すると、計算結果がおかしくなったりシステムエラーになったりする可能性がある。
真偽値
.isBoolean()
は、引数なしだと 0 や 1 、文字列のtrue
とfalse
を許容する。データ型として真偽値だけを許容したい場合は、.isBoolean()
の引数に{ strict: true }
を設定する。
// 真偽値
body('boolean').isBoolean({ strict: true }),
もし、意図せずに真偽値以外のデータ型を許容すると、文字列のfalse
や 0 を真と判定してリクエスト側が意図しない処理が行われる可能性がある。