
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:管理者