共通モデル

JSONデータにアクセスのための共通モデル「models/Model.js」を作成します。

ファイル構成

express_mvc/
├── controllers/
│   ├── HomeController.js
│   ├── ItemController.js
│   ├── LoginController.js
│   └── UserController.js
├── data/
│   ├── items.json
│   └── users.json
├── models/
│   ├── User.js
│   └── Item.js
├── node_modules
├── package-lock.json
├── package.json
├── public/
│   ├── images/
│   └── js/
├── routes.js
├── server.js
└── views/
    ├── components/
    │        ├── nav.ejs
    │        └── footer.ejs
    ├── index.ejs
    ├── item/
    │     ├── index.ejs
    │     └── show.ejs
    ├── layouts/
    │     └── default.ejs
    ├── login/
    │     └── index.ejs
    └── user/
          └── index.ejs

Modelクラス作成

Modelクラスを作成し、モジュール化します。

models/Model.js
class Model {

}

module.exports = Model;

メソッド追加

get()find() メソッドを追加し、外部ファイルアクスの fsモジュールも読み込んでおきます。

models/Model.js
// fsモジュール読み込み
const fs = require('fs');

class Model {

    // すべてのデータ取得
    get = () => {
        var values = JSON.parse(fs.readFileSync(this.dataFile, 'utf8'));
        return values
    }

    // IDからデータ取得
    find = (id) => {
        var values = this.get()
        return values.find((value) => value.id == id)
    }
}

module.exports = Model;

商品データ処理

Itemモデル作成

Itemモデルを作成しModelを継承します。またJSONデータのパスを設定します。

models/Item.js
// Modelクラス読み込み
const Model = require('./Model')

// Modelクラス継承
class Item extends Model {
    //JSONデータのパス
    dataFile = "./data/items.json"; 
}

module.exports = Item

商品データ取得

すべてのデータ取得

Itemインスタンスを作成し、 get() 商品データをすべて取得します。

controllers/ItemController.js
exports.index = (req, res) => {
    //インスタンス生成
    const item = new Item()
    //データ取得
    var data = {
        items: item.get()
    }
    res.render('item/index', data)
}

IDからデータ取得

Itemインスタンスを作成し、 find() でIDから商品を取得します。

controllers/ItemController.js
exports.show = (req, res) => {
    const id = req.params.id;
    const item = new Item();
    var data = {
        item: item.find(id)
    }
    res.render('item/show', data);
}

ログイン処理

Userモデルを利用して、簡易的にログイン認証処理をします。

JSONデータ用意

ユーザデータを「data/users.json」として用意しておきます。

data/users.json
[
    {
        "id": 1,
        "email": "[email protected]",
        "password": "1234",
        "name": "Alice",
        "hobby": [ "旅行", "グルメ" ]
    },
    {
        "id": 2,
        "email": "[email protected]",
        "password": "1234",
        "name": "Bob",
        "hobby": [ "旅行", "スポーツ" ]
    },
    {
        "id": 3,
        "email": "[email protected]",
        "password": "1234",
        "name": "Chris",
        "hobby": [ "読書", "ゲーム" ]
    }
]
  • パスワードが平文になっているためHash化が必要ですが、今回はそのままとします。

User作成

Userモデルを作成しModelを継承します。またJSONデータのパスを設定します。

models/User.js
const Model = require('./Model');

class User extends Model {
    dataFile = "./data/users.json"; 
}

module.exports = User

認証処理

auth() メソッドを追加します。emailpasswordが一致したら、ユーザデータを返します。

models/User.js
const Model = require('./Model')

class User extends Model {
    dataFile = "./data/users.json"; 

    //認証処理(Emailとパスワード)
    auth = (email, password) => {
        return this.get().find((value) => 
            (value.email == email && value.password == password)
        )
    }
}

module.exports = User

ログイン処理

LoginControllerauth() で認証処理を修正します。

controllers/LoginController
const User = require('../models/User');

exports.index = (req, res) => {
    res.render('login/index')
}

exports.auth = (req, res) => {
    const email = req.body.login_name;
    const password = req.body.password;

    // 認証処理
    const user = new User();
    const authUser = user.auth(email, password);

    if (authUser) {
        //認証できたらユーザホームにリダイレクト
        res.redirect('/user');
    } else {
        //認証が失敗したらログインページにリダイレクト
        res.redirect('/login');
    }
}