【Node.js】Expressでバリデーションが機能しない問題の原因と対策

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);
  }
);

このルートでは、idupdate_dt の2つの入力項目が空でないことを確認するバリデーションを設定しています。
しかし、実際にリクエストを送ると、update_dtundefined である場合でもバリデーションエラーにならず、処理が継続してしまうケースがあります。

原因

この問題の主な原因は、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_dtundefined の場合にもバリデーションエラーが発生するようになります。

exists() のみを使う

もし update_dtundefined でないことだけを確認したい場合は、exists() のみを使用する方法もあります。

check('update_dt').exists()

express.json() の確認

前述のように、リクエストのボディが適切に解析されているかを確認するため、express.json() が適切に設定されているかを確認してください。

app.use(express.json());

まとめ

Node.jsExpressexpress-validator を使ってバリデーションを行う際に、not().isEmpty() だけでは undefined の値を検出できない問題が発生することがあります。
この問題を防ぐためには、exists() を追加してフィールドの存在をチェックすることが重要です。
また、リクエストボディが正しく解析されるように express.json() の設定も確認しましょう。

適切なバリデーションを行うことで、不正なデータの処理を防ぎ、より安全なAPIを構築することができます。


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA