MongoDBNode.js

MongooseにMVC設計パターンを使ってみる

はじめに

前回、express.Routerを使いコード分割を行ったがMongoose関連の処理が固まっているのでMVC設計パターンを使って分割してみる。

MVC設計パターン

モデル(Model)

モデルはデータの構造を定義する。

モデルをまとめるmodels フォルダを直下に作成する。

次にusersモデル用のusersModel.js を作成する。

usersModel.js

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema(
  {
    name: String,
    age: Number,
  },
  { timestamps: true }
);

const User = mongoose.model("users", userSchema);

module.exports = User;

ビュー(View)

ビューは、ユーザーに表示されるデータやUIを定義するところだが、今回は使わない。

コントローラ (Controller)

コントローラはルートやエンドポイントを処理し、データベース操作を定義する。

コントローラ をまとめるcontrollers フォルダを直下に作成する。

次にusersコントローラ用のusersController.js を作成する。

usersController.js

const User = require("../models/usersModel");

// ユーザー一覧取得
exports.getUser = async (req, res) => {
  try {
    const users = await User.find();
    res.json(users);
  } catch (error) {
    res.status(500).json({ error: "ユーザの取得に失敗しました。" });
  }
};

// ユーザー取得(ByUserId)
exports.getUserByUserId = async (req, res) => {
  try {
    const userId = req.params.userId;
    const user = await User.findById(userId);
    res.json(user);
  } catch (error) {
    res.status(500).json({ error: "ユーザの取得に失敗しました。" });
  }
};

// ユーザー作成
exports.createUser = async (req, res) => {
  try {
    const addUser = req.body;
    const newUser = new User(addUser);
    await newUser.save();

    res.json({ message: "ユーザが登録されました。", user: newUser });
  } catch (error) {
    res.status(500).json({ error: "ユーザの登録に失敗しました。" });
  }
};

// ユーザー更新
exports.updateUser = async (req, res) => {
  try {
    const userId = req.params.userId;
    const updateFields = req.body;

    // ユーザを更新
    const updatedUser = await User.findByIdAndUpdate(
      userId,
      { $set: updateFields },
      { new: true }
    );
    if (!updatedUser) {
      return res.status(404).json({ message: "ユーザが見つかりません。" });
    }

    res.json({ message: "ユーザが更新されました。", user: updatedUser });
  } catch (error) {
    res.status(500).json({ error: "ユーザの更新に失敗しました。" });
  }
};

// ユーザー削除
exports.deleteUser = async (req, res) => {
  try {
    const userId = req.params.userId;
    const deletedUser = await User.findByIdAndDelete(userId);

    if (!deletedUser) {
      return res.status(404).json({ message: "ユーザが見つかりません。" });
    }

    res.json({ message: "ユーザが削除されました。", user: deletedUser });
  } catch (error) {
    res.status(500).json({ error: "ユーザの削除に失敗しました。" });
  }
};

ソースコード

今回作ったコードはGithubで管理

GitHub - ashitaka1963/express_connect_mongodb_sample at d70007261cab4f2eb699b229b73c45410bef79ab

おわりに

無事にMVCパターンを適用し、コード分割を行うことができた。

いまは、MongoDBのユーザコレクションのリソースに対するモジュール分割だけだが、リソースが増えればより効果が出てきそう。

ただ、まだ分割したモジュール内にMongoDB関連のコードが丸っと入っているので、次はこのあたりを整理していく。