はじめに
前回、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関連のコードが丸っと入っているので、次はこのあたりを整理していく。