5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Node.js express】express-validatorでバリデーションを実装し、通過した値をセッションに格納する。

Last updated at Posted at 2020-11-27

以下の項目を満たすバリデーションをexpress-validatorで実装してみる。
テンプレートエンジンはejs。フレームワークはexpress

  • パスワードが7文字以上
  • パスワードが確認用と一致している
  • 全ての項目が入力されている
  • 問題なかったら、ホーム画面へ

現在の状況
サインアップのフロントページ作成済
bc216d7ecd548acd6ecb29001bf34918.png

1) express-validatorをインストールする。

Dockerfileに、ビルド時にexpress-validatorをインストールするように記載。

参考
https://qiita.com/sho_U/items/0ef3dfc7b07b5e13fa18

# express-validatorを追記

RUN npm install ejs\
  express-validator

2) express-validatorをrequireする。(分割代入)

users.js
const { check, validationResult } = require('express-validator');

const check = バリデーションチェックを行うための関数
const validationResult = 実行結果に関する情報などを管理するResultFactoryというオブジェクトを生成する関数

が格納される。

3)ルーティングの第2引数に条件を追加

users.js
[
  // checkメソッドを使用してバリデーションを実行
  // withMessageメソッドで弾かれた場合のmsgを設定

  check('name').not().isEmpty().withMessage('nameEmpty'),
  check('email').not().isEmpty().withMessage('emailEmpty'),
  check('password').not().isEmpty().withMessage('passwordEmpty'),
  check('password').isLength({ min: 7 }).withMessage('passwordUnder7'),
  //バリデーションをカスタムで作成
  check('password').
    custom((value, { req }) => {
      //一致した場合trueを返す
      if (req.body.password === req.body.confirmPassword) {
        return true;
      }
    }).withMessage('passwordNoMach')
],

4)ルーティングの第3引数にバリデーションエラー時の処理(クロージャー)を追加

users.js
  function (req, res, next) {
    //結果をerrorsに格納
    const errors = validationResult(req);
    //引っ掛かった場合
    if (!errors.isEmpty()) {
      console.log(errors)
    }

console.logでerrorsの中身を確認

Result {
formatter: [Function: formatter],
   errors: [
     { 
       value: '', 
       msg: 'nameEmpty', 
       param: 'name', 
       location: 'body' 
     },
     { 
       value: '', 
       msg: 'emailEmpty', 
       param: 'email', 
       location: 'body' 
     },
     {
       value: '1',
       msg: 'passwordUnder7',
       param: 'password',
       location: 'body'
     },
     {
       value: '1',
       msg: 'passwordNoMach',
       param: 'password',
       location: 'body'
     }
   ]
 }

errors:errors:{}で格納されている。

第3引数の処理全体

users.js
  function (req, res, next) {
    const errors = validationResult(req);
    //エラーオブジェクトをerrorsに格納。
    if (!errors.isEmpty()) {
      let messages = [];
      errors.errors.forEach((error) => {
        messages.push(error.msg);
      //配列に格納
      });
      res.render('users/signup', { messages: messages })
    } else {
      req.session.name = req.body.name;
      //セッションに格納
      res.redirect("/home");
    }
  });

express-sessionモジュールを利用する。

//インストール
npm install express-session
app.js
//追記
const session = require("express-session");

//appオブジェクトにsession設定を組み込む。
// app = express()とルーティング設定の範囲に記載
app.use(session({
  secret: "secretWord",
  resave: false,
  saveUninitialized: true,
  cookie: { maxAge: 10 * 1000 }
}));

session({ オプション })でexpress-sessionの設定をする。

secret:
クッキーに保存するセッションIDを署名するために使用される秘密ワード。

resave
セッションをセッションストアに強制的に保存するかどうかの設定。

saveUninitialized
初期化されていないセッションを強制的に保存するかどうかの設定。

cookie
セッションIDのクッキーの設定を指定できます。 maxAge:保存期間。

5
2
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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?