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

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

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

現在の状況
サインアップのフロントページ作成済
![bc216d7ecd548acd6ecb29001bf34918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547556/addb9c54-2a4b-8142-5e38-49d563a4aa2e.png)

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

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

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

```Dockerfile
#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:{}で格納されている。

第３引数の処理全体

```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：保存期間。