Loading lessons...
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.