Lesson 30 +10 XP

Project 4: Production-Ready Express Application

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


javascript
// 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.