17.
モデル
共通モデル
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() メソッドを追加します。emailとpasswordが一致したら、ユーザデータを返します。
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
ログイン処理
LoginControllerのauth() で認証処理を修正します。
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');
}
}