Lesson 30 +10 XP

Project 4: Production-Ready Express Application

Architecture of a Enterprise-Ready Express App

In this final project, you will organize a Node.js & Express application into a clean modular layer architecture.

Directory Structure Pattern

src/
├── config/
│   └── db.js            # Mongoose connection
├── controllers/
│   └── userController.js# Route logic & responses
├── middleware/
│   ├── auth.js          # JWT & security middleware
│   └── errorHandler.js  # Global error middleware
├── models/
│   └── User.js          # Mongoose model schema
├── routes/
│   └── userRoutes.js    # Express Router routes
├── utils/
│   └── AppError.js      # Custom error class
└── server.js            # App entry point

Modular Controller & Router Pattern

// routes/userRoutes.js
const express = require("express");
const router = express.Router();
const { getUsers, createUser } = require("../controllers/userController");
const { protect } = require("../middleware/auth");

router.route("/")
  .get(protect, getUsers)
  .post(createUser);

module.exports = router;
// server.js - Main Entry Point
require("dotenv").config();
const express = require("express");
const userRoutes = require("./routes/userRoutes");
const errorHandler = require("./middleware/errorHandler");

const app = express();
app.use(express.json());

// Mount routers
app.use("/api/v1/users", userRoutes);

// Mount Global Error Handler
app.use(errorHandler);

const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Enterprise server running on port ${PORT}`));

TL;DR

  • Separate concerns into Controllers, Models, Routes, and Middleware.
  • Use express.Router() to create modular sub-route modules.
  • Mount global error handler after mounting routers.