Open4

Express で req.query のバリデーションをしたい【Notion AI を使って作ったメモ】

hankei6kmhankei6km

Cloud Function のバリデーションを行うための前準備としてExpress でのバリデーションについて少しメモ。


試しに Notion AI を利用してみた。ここから下のコメントは 疑問に思ったことが出てきたら、Notion AI の「文章作成を依頼」に質問を入力しながら生成したもの。

例) 「express-validator のインストール方法を教えてください。」と入力。

挿入されているコードは基本的に動きません。一部 ※ を付けて注釈を入れています。

hankei6kmhankei6km

コードは動かなかったり怪しいところも多いですが「そういうメモ」だと思っていれば、Notion AI でメモを作ると初めて使うライブラリのあたりを付ける手間を結構減らせるかなと(空気を読まずに質問しまくっても回答してくれる人がいる感じ)。

このメモを参考に作ったコミット。
https://github.com/hankei6km/test-functions-framework-pubsub-ts/commit/492ea7db1a92845f9f1e5c9bc4f2be83cb83740a

hankei6kmhankei6km

利用できるライブラリーの一覧と特徴など

Express にはバリデーションのためのライブラリーがいくつか存在します。 express-validatorjoi などがよく利用されます。
express-validator は、値の検証を行うための基本的な機能を持っています。また、 joi は強力なスキーマ検証機能を提供しており、リクエストのオブジェクトを検証するのに優れています。

hankei6kmhankei6km

express-validator を利用してみる

express-validator のインストールは非常に簡単です。NPM を使ってインストールすることができます。NPM を使う場合は、次のコマンドを実行してください。

npm install express-validator

TypeScript 用にインストールする場合は、次のコマンドを実行してください。(※ TypeScript 用にインストールする方法を質問したら生成された文章、express-validator に型定義も含まれているので実際にやると NPM からメッセージが出る)

npm install --save-dev @types/express-validator

クエリーの項目が存在するか検証する場合、 express-validatorquery メソッドを使うことができます。 query メソッドを使うと、リクエストのクエリー文字列を検証することができます。

  • TypeScript で Express middleware 形式のサンプルコード

    import { query } from 'express-validator';
    
    export const validate = (): RequestHandler => {
      return async (req, res, next) => {
        await query('name').notEmpty();
        await query('email').isEmail();
    
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
          res.status(400).send({ errors: errors.array() });
        }
        next();
      };
    };
    
    
  • router を使う場合のサンプルコード

    import { Router } from 'express';
    import { query } from 'express-validator';
    
    const router = Router();
    
    router.get('/',
      query('name').notEmpty(),
      query('email').isEmail(),
      (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
          res.status(400).send({ errors: errors.array() });
        }
        res.send('Validation successful!');
      });
    
    export default router;
    
    

複数の query を1つにまとめる場合は、express-validatorcheck メソッドを使うことができます。 check メソッドを使うと、複数の query を1つのオブジェクトにまとめて検証することができます。

  • TypeScript で Express middleware 形式のサンプルコード

    import { check } from 'express-validator';
    
    export const validate = (): RequestHandler => {
      return async (req, res, next) => {
        await check('name').notEmpty();
        await check('email').isEmail();
        await check('password').isLength({ min: 8 });
        await check('password_confirmation').notEmpty().custom((value, { req }) => {
          if (value !== req.body.password) {
            throw new Error('Password confirmation does not match');
          }
          return true;
        });
    
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
          res.status(400).send({ errors: errors.array() });
        }
        next();
      };
    };
    
    

query メソッドは、リクエストのクエリー文字列を検証するのに使います。一方、check メソッドは、複数の query を1つのオブジェクトにまとめて検証するのに利用できます。(※ちょっとピンとこなかったので検索した https://stackoverflow.com/a/56820456)

express-validator の型定義は、 DefinitelyTyped にあります。(※ query の型定義について質問したら生成された文章、 404 になる)