はじめに
Expressを学び始めて、エラーハンドラの扱い方にいくつかのパターンがあるため、実装方法を整理。
本記事では、第2弾としてExpressにおける、エラーハンドラを利用したミドルウェアのバリデーションをまとめる。
- Expressのエラー処理まとめ 【第1弾】Expressのエラーハンミドラの定義
- Expressのエラー処理まとめ 【第2弾】バリデーションのミドルウェア(本記事)
- Expressのエラー処理まとめ 【第3弾】非同期関数のエラーハンドラ
1.ルートハンドラでバリデーションの定義
ルートハンドラでミドルウェアを複数列挙することで、リクエストを受けてからレスポンスまでに行いたいバリデーションを複数定義することができる。
その列挙されたミドルウェアの中で、バリデーションエラーが発覚した場合、エラーを発生させてバリーデーションエラーを実装することができる。
// ルートハンドラ
app.get('/login', verifyLoginid, verifyPassword, (req, res) => {
res.send('ログインしました。')
});
上記の場合、「/login」にリクエストがあった場合に、レスポンスを返すまでにの以下の流れで処理される。
- verifyLoginid:ログインIDのバリデーションを実施
- verifyPassword:ログインパスワードのバリデーションを実施
- レスポンスのコールバック関数
バリーデションミドルウェア関数の中身
バリデーションのミドルウェアでは正常の場合は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もしくは、パスワードが誤っている場合はエラーになり、エラーハンドラーにキャッチされていることがことが分かる。
idとパスワードの両方とも正しい場合に、ルートハンドラのレスポンスコールバック関数が処理され、ログインができていることが分かる。
まとめ
ルートハンドラでバリデーションミドルウェアを実装すると、OKの時は次の処理(ミドルウェアもしくはレスポンスのコールバック関数)へ移り、NGの場合はエラーハンドラへエラーを飛ばすことで入力チェックを実装することができる。app.useのミドルウェア関数と使い方は異なるが、ルートハンドラに組み込まれる関数とエラーハンドラを利用することでバリデーションを実装できることが分かった。
エラー処理のまとめ第3弾へ続く。