Editors Choice

3/recent/post-list

MVC Patterns - Module Views and Controller

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

Post a Comment

0 Comments