Express で req.query のバリデーションをしたい【Notion AI を使って作ったメモ】
Cloud Function のバリデーションを行うための前準備としてExpress でのバリデーションについて少しメモ。
試しに Notion AI を利用してみた。ここから下のコメントは 疑問に思ったことが出てきたら、Notion AI の「文章作成を依頼」に質問を入力しながら生成したもの。
例) 「express-validator のインストール方法を教えてください。」と入力。
挿入されているコードは基本的に動きません。一部 ※ を付けて注釈を入れています。
コードは動かなかったり怪しいところも多いですが「そういうメモ」だと思っていれば、Notion AI でメモを作ると初めて使うライブラリのあたりを付ける手間を結構減らせるかなと(空気を読まずに質問しまくっても回答してくれる人がいる感じ)。
このメモを参考に作ったコミット。
利用できるライブラリーの一覧と特徴など
Express にはバリデーションのためのライブラリーがいくつか存在します。 express-validator
や joi
などがよく利用されます。
express-validator
は、値の検証を行うための基本的な機能を持っています。また、 joi
は強力なスキーマ検証機能を提供しており、リクエストのオブジェクトを検証するのに優れています。
express-validator
を利用してみる
express-validator
のインストールは非常に簡単です。NPM を使ってインストールすることができます。NPM を使う場合は、次のコマンドを実行してください。
npm install express-validator
TypeScript 用にインストールする場合は、次のコマンドを実行してください。(※ TypeScript 用にインストールする方法を質問したら生成された文章、express-validator に型定義も含まれているので実際にやると NPM からメッセージが出る)
npm install --save-dev @types/express-validator
クエリーの項目が存在するか検証する場合、 express-validator
の query
メソッドを使うことができます。 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-validator
の check
メソッドを使うことができます。 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
になる)