Node.js、Express.js、そして Sequelize を活用した MVC パターンのウェブアプリケーションの構築

MVC (Model-View-Controller) パターンは、ソフトウェアのデザインパターンであり、アプリケーションをモデル、ビュー、およびコントローラの 3 つの主要なコンポーネントに分割して開発する方法です。Node.js と Express.js を使用して MVC パターンを実装する場合、次のようなフォルダ構造を持つことができます。

モデルとは?

データとデータ処理を担当します。データのバリデーション、保存、取得などのタスクを処理します。

ビューとは?

ユーザーに表示される内容を管理します。クライアントにデータを提供する役割を果たします。

コントローラとは?

モデルとビューの間の中間役割を果たします。クライアントのリクエストを受け、そのリクエストに応じたモデルの操作を処理し、その結果をビューに伝えます。


MVC パターンのフォルダ構造の例

  • Name
    フォルダ構造の例
    Type
    Description

    app.jsはExpressアプリケーションのエントリーポイントであり、ルーティングやミドルウェアの設定などを管理します。routesフォルダ内では、各エンティティ(ユーザーや投稿など)ごとにルーティングを分割して管理します。

    この構造を基に、Express.jsのミドルウェアとルーティングを活用して、クライアントのリクエストを処理し、データをモデルとビューの間で調整する方法でMVCパターンを実装できます。

フォルダ構造

root/
├─ models/
│  ├─ user.js
│  └─ post.js

├─ views/
│  ├─ home.ejs
│  └─ profile.ejs

├─ controllers/
│  ├─ userController.js
│  └─ postController.js

├─ public/ (정적 파일)

├─ routes/
│  ├─ index.js
│  ├─ userRoutes.js
│  └─ postRoutes.js

├─ app.js
└─ package.json

app.js(Express の設定)

  • Name
    Expressの設定
    Type
    Description

    Expressフレームワークを使用してウェブアプリケーションを構築し、ルーティングを中心にウェブリクエストを処理する方法です。ルーティングはクライアントのリクエストに応じて適切なハンドラー関数を呼び出してリクエストを処理する仕組みです。

    従来の設定と比較すると、app.use('/users', userRoutes)が追加されていることが分かります。

    基本設定コードを表示

app.js

const express = require('express');
const app = express();
const userRoutes = require('./routes/userRoutes');
const postRoutes = require('./routes/postRoutes');

app.use(express.json());
app.use('/users', userRoutes);
app.use('/posts', postRoutes);

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

Routes

  • Name
    API エンドポイントの定義
    Type
    Description

    ユーザー関連のAPIエンドポイントをルーティングファイルに定義し、ユーザーコントローラを介して2種類のHTTPリクエストを処理する方法を示します。

userRoutes.js

const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');

router.get('/', userController.getAllUsers);
router.post('/', userController.createUser);

module.exports = router;

Controllers

  • Name
    ユーザーリクエストの処理
    Type
    Description

    ユーザー関連のロジックを処理するコントローラーです。コードは2つの例を通じてAPIリクエストの処理方法を示しています。

userController.js

const { User } = require('../models');

exports.getAllUsers = async (req, res) => {
    try {
        const users = await User.findAll();
        res.json(users);
    } catch (error) {
        res.status(500).json({ message: 'Error retrieving users' });
    }
};

exports.createUser = async (req, res) => {
const { name, email } = req.body;
    try {
        const newUser = await User.create({ name, email });
        res.json(newUser);
    } catch (error) {
        res.status(500).json({ message: 'Error creating user' });
    }
};

Models

  • Name
    ORM(Sequelizeを使用したモデルの定義)
    Type
    Description

    データベースモデルを定義するためにSequelizeを使用するファイルの例です。SequelizeはNode.jsでSQLデータベースを操作するためのプロミスベースのORM(オブジェクト関係マッピング)ライブラリです。

user.js

const { DataTypes } = require('sequelize');
const sequelize = require('../database');

const User = sequelize.define('User', {
    name: {
        type: DataTypes.STRING,
        allowNull: false
    },
    email: {
        type: DataTypes.STRING,
        allowNull: false
    }
});

module.exports = User;

MVC パターンのまとめ

こちらは簡単なサンプルコードです。Sequelize を使用してデータベースモデルを定義するには個別の設定が必要であり、Express.js を使用してルーティングとコントローラの構成を行う場合は、各ファイルのパスと設定に基づいてコードのエラー処理やセキュリティなどの追加事項を考慮する必要があります。

現在の記事は MVC パターンについてまとめたものですが、MVCS(Service)パターンをお勧めします。サービスレイヤーを追加することで、コントローラーコードをより整理し、再利用可能なビジネスロジックをモジュール化することができます。ロジックを分離することは、MVC パターンを拡張し、よりモジュラーな設計を実現する手段です。