Implementing MVC Pattern in Node.js
In this tutorial, we’ll explore the MVC (Model-View-Controller) pattern in Node.js. MVC separates an application into three components:
- Model → Handles data and business logic
- View → Displays data (UI)
- Controller → Manages user requests
Project Structure
project/
├── models/
├── views/
├── controllers/
├── routes/
└── middlewares/
1. Model (Database Layer)
File: models/personalDetails.js
const mongoose = require('mongoose');
mongoose.connect("your_mongodb_connection_string_here")
.then(() => console.log("Connected to MongoDB"))
.catch(err => console.log('Error Connecting to DB'));
const personalDetails = new mongoose.Schema({
cnic: {
type: String,
required: true,
unique: true,
},
firstName: {
type: String,
required: true
},
lastName: {
type: String,
required: true
},
address: String
});
const student = mongoose.model('student', personalDetails);
module.exports = student;
2. View (Placeholder)
File: views/personalDetails.js
// Template engine code will be added later
// Create folder and file structure first
3. Controller (Business Logic)
File: controllers/personalDetails.js
const student = require("../models/personalDetails");
async function handleGetAllStudents(req, res) {
const allStudents = await student.find({});
return res.status(200).json(allStudents);
}
async function getStudentById(req, res) {
const studentInfo = await student.findById(req.params.id);
if(!studentInfo) {
return res.status(404).json({error: "Student not found"});
}
return res.json(studentInfo);
}
module.exports = { handleGetAllStudents, getStudentById };
4. Routes
File: routes/personalDetails.js
const express = require('express');
const { handleGetAllStudents, getStudentById } = require('../controllers/personalDetails');
const router = express.Router();
router.get('/', handleGetAllStudents);
router.get('/:id', getStudentById);
module.exports = router;
5. Middleware (Logger)
File: middlewares/personalDetails.js
const fs = require('fs');
const logger = (req, res, next) => {
fs.appendFile('log.txt',
`Request from IP: ${req.ip} at ${new Date().toISOString()}\n`,
(err) => err ? console.error(err) : null
);
next();
};
module.exports = logger;
6. Index
const express = require('express');
const logger = require('./middlewares/logger');
const personalDetailsRouter = require('./routes/personalDetails');
const app = express();
app.use(logger);
app.use(express.urlencoded({extended : false}));
app.use(express.json({extended : false}));
app.use('/api/personalDetails', personalDetailsRouter)
app.listen(8080, ()=>{
console.log("Server Running on Port 8080");
})
Conclusion
This MVC structure keeps your Node.js application organized and maintainable. Next steps:
- Add template engines (EJS/Pug) for Views
- Implement environment variables
- Extend with authentication
0 Comments