Webアプリケーションの開発において、バリデーション(入力データの検証)は非常に重要です。
特に、APIを設計する際にユーザーから送信されるデータを適切にチェックしないと、データの不整合やセキュリティリスクにつながる可能性があります。
本記事では、Node.jsのWebフレームワークであるExpressと、入力検証のためのライブラリ「express-validator」を使用する際に、バリデーションが正しく機能しない問題の原因と、その解決策について解説します。
問題の概要
例えば、次のようなAPIを設計するとします。
const express = require('express'); const { check, validationResult } = require('express-validator'); const router = express.Router(); router.put('/update', [ check('id').not().isEmpty(), check('update_dt').not().isEmpty(), ], async (req, res) => { return await handleRequest(req, res, 'apiName', updateFunction); } );
このルートでは、id
と update_dt
の2つの入力項目が空でないことを確認するバリデーションを設定しています。
しかし、実際にリクエストを送ると、update_dt
が undefined
である場合でもバリデーションエラーにならず、処理が継続してしまうケースがあります。
原因
この問題の主な原因は、not().isEmpty()
の挙動にあります。
not().isEmpty()
は undefined
をチェックしない
not().isEmpty()
は、値が空文字列(””)や空の配列であるかどうかを検証します。
しかし、以下の場合はチェック対象にならず、バリデーションを通過してしまいます。
- フィールド自体が存在しない(
undefined
) - クライアント側から送信されなかった
リクエストのボディが正しくパースされていない
Expressでは、リクエストのボディを取得するために express.json()
などのミドルウェアを設定する必要があります。
もし適切な設定がない場合、リクエストのデータが正しく解析されず、req.body
が空になり、バリデーションが機能しない可能性があります。
const express = require('express'); const app = express(); app.use(express.json());
この設定がないと、JSONデータのリクエストを受け取っても req.body
が空のままとなり、バリデーションが機能しないことがあります。
解決策
exists()
を使用する
exists()
は、フィールドが undefined
ではないこと を確認するメソッドです。
これを使用することで、フィールドが存在しない場合にもバリデーションエラーを発生させることができます。
修正後のコードは以下のようになります。
router.put('/update', [ check('id').not().isEmpty(), check('update_dt').exists().not().isEmpty(), // 修正 ], async (req, res) => { return await handleRequest(req, res, 'apiName', updateFunction); } );
この変更により、update_dt
が undefined
の場合にもバリデーションエラーが発生するようになります。
exists()
のみを使う
もし update_dt
が undefined
でないことだけを確認したい場合は、exists()
のみを使用する方法もあります。
check('update_dt').exists()
express.json()
の確認
前述のように、リクエストのボディが適切に解析されているかを確認するため、express.json()
が適切に設定されているかを確認してください。
app.use(express.json());
まとめ
Node.jsのExpressで express-validator
を使ってバリデーションを行う際に、not().isEmpty()
だけでは undefined
の値を検出できない問題が発生することがあります。
この問題を防ぐためには、exists()
を追加してフィールドの存在をチェックすることが重要です。
また、リクエストボディが正しく解析されるように express.json()
の設定も確認しましょう。
適切なバリデーションを行うことで、不正なデータの処理を防ぎ、より安全なAPIを構築することができます。
- Original:https://minory.org/node-express-validator-issue.html
- Source:minory
- Author:管理者