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