Webアプリケーションの開発において、バリデーション(入力データの検証)は非常に重要です。
特に、APIを設計する際にユーザーから送信されるデータを適切にチェックしないと、データの不整合やセキュリティリスクにつながる可能性があります。
本記事では、Node.jsのWebフレームワークであるExpressと、入力検証のためのライブラリ「express-validator」を使用する際に、バリデーションが正しく機能しない問題の原因と、その解決策について解説します。
問題の概要
例えば、次のようなAPIを設計するとします。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 が空になり、バリデーションが機能しない可能性があります。
|
1 2 3 4 |
const express = require('express'); const app = express(); app.use(express.json()); |
この設定がないと、JSONデータのリクエストを受け取っても req.body が空のままとなり、バリデーションが機能しないことがあります。
解決策
exists() を使用する
exists() は、フィールドが undefined ではないこと を確認するメソッドです。
これを使用することで、フィールドが存在しない場合にもバリデーションエラーを発生させることができます。
修正後のコードは以下のようになります。
|
1 2 3 4 5 6 7 8 9 |
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() のみを使用する方法もあります。
|
1 |
check('update_dt').exists() |
express.json() の確認
前述のように、リクエストのボディが適切に解析されているかを確認するため、express.json() が適切に設定されているかを確認してください。
|
1 |
app.use(express.json()); |
まとめ
Node.jsのExpressで express-validator を使ってバリデーションを行う際に、not().isEmpty() だけでは undefined の値を検出できない問題が発生することがあります。
この問題を防ぐためには、exists() を追加してフィールドの存在をチェックすることが重要です。
また、リクエストボディが正しく解析されるように express.json() の設定も確認しましょう。
適切なバリデーションを行うことで、不正なデータの処理を防ぎ、より安全なAPIを構築することができます。


コメント