LoginSignup
1
0

More than 1 year has passed since last update.

Expressのエラー処理まとめ 【第2弾】バリデーションのミドルウェア

Last updated at Posted at 2022-10-17

はじめに

Expressを学び始めて、エラーハンドラの扱い方にいくつかのパターンがあるため、実装方法を整理。
本記事では、第2弾としてExpressにおける、エラーハンドラを利用したミドルウェアのバリデーションをまとめる。

  1. Expressのエラー処理まとめ 【第1弾】Expressのエラーハンミドラの定義
  2. Expressのエラー処理まとめ 【第2弾】バリデーションのミドルウェア(本記事)
  3. Expressのエラー処理まとめ 【第3弾】非同期関数のエラーハンドラ

1.ルートハンドラでバリデーションの定義

ルートハンドラでミドルウェアを複数列挙することで、リクエストを受けてからレスポンスまでに行いたいバリデーションを複数定義することができる。
その列挙されたミドルウェアの中で、バリデーションエラーが発覚した場合、エラーを発生させてバリーデーションエラーを実装することができる。

// ルートハンドラ
app.get('/login', verifyLoginid, verifyPassword, (req, res) => {
    res.send('ログインしました。')
});

上記の場合、「/login」にリクエストがあった場合に、レスポンスを返すまでにの以下の流れで処理される。

  1. verifyLoginid:ログインIDのバリデーションを実施
  2. verifyPassword:ログインパスワードのバリデーションを実施
  3. レスポンスのコールバック関数

バリーデションミドルウェア関数の中身

バリデーションのミドルウェアでは正常の場合はnext()で次の関数へ進み、入力エラーが発見された場合は、エラーハンドラーを利用してレスポンスを返す形が基本形。
「verifyLoginid」と「verifyPassword」中身を確認する。

// Idのバリデーション
const verifyLoginid = (req, res, next) => {
    const { id } = req.query;
    if (id === 'hoge') {
        return next(); //次のミドルウェアへ
    } else {
        // エラーハンドラへ
        throw new AppError('ログインIDが誤っています', 401);
    }
}

// Passwordのバリデーション
const verifyPassword = (req, res, next) => {
    const { password } = req.query;
    if (password === 'moge') {
        return next(); //次のミドウェア(コールバック関数)へ
    } else {
        // エラーハンドラへ
        throw new AppError('パワードが誤っています', 401);
    }
}

// ルートハンドラ
app.get('/login', verifyLoginid, verifyPassword, (req, res) => {
    res.send('ログインしました。')
});

処理の結果として、idもしくは、パスワードが誤っている場合はエラーになり、エラーハンドラーにキャッチされていることがことが分かる。
image.png

idとパスワードの両方とも正しい場合に、ルートハンドラのレスポンスコールバック関数が処理され、ログインができていることが分かる。
image.png

まとめ

ルートハンドラでバリデーションミドルウェアを実装すると、OKの時は次の処理(ミドルウェアもしくはレスポンスのコールバック関数)へ移り、NGの場合はエラーハンドラへエラーを飛ばすことで入力チェックを実装することができる。app.useのミドルウェア関数と使い方は異なるが、ルートハンドラに組み込まれる関数とエラーハンドラを利用することでバリデーションを実装できることが分かった。
エラー処理のまとめ第3弾へ続く。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0