1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

express-validatorでJSONのデータ型をチェックする

Posted at

要旨

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 、文字列のtruefalseを許容する。データ型として真偽値だけを許容したい場合は、.isBoolean()の引数に{ strict: true }を設定する。

// 真偽値
body('boolean').isBoolean({ strict: true }),

もし、意図せずに真偽値以外のデータ型を許容すると、文字列のfalseや 0 を真と判定してリクエスト側が意図しない処理が行われる可能性がある。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?