/project-root
βββ /src
β βββ /config # Configuration files (DB, env, etc.)
β β βββ db.config.js
β β βββ env.config.js
β β βββ logger.config.js
β βββ /loaders # Application bootstrapping (DB, Express, etc.)
β β βββ express.js
β β βββ database.js
β β βββ security.js
β β βββ routes.js
β βββ /models
β β βββ users.ts
β βββ /modules # Feature-based modular services
β β βββ /auth
β β β βββ auth.controller.js
β β β βββ auth.service.js
β β β βββ auth.routes.js
β β β βββ auth.middleware.js
β β βββ /user
β β β βββ user.controller.js
β β β βββ user.service.js
β β β βββ user.routes.js
β β β βββ user.middleware.js
β β βββ /order
β β β βββ order.controller.js
β β β βββ order.service.js
β β β βββ order.routes.js
β β β βββ order.middleware.js
β βββ /middlewares # Global middlewares
β β βββ auth.middleware.js
β β βββ error.middleware.js
β β βββ validation.middleware.js
β βββ /shared # Reusable utilities/helpers
β β βββ jwt.helper.js
β β βββ logger.helper.js
β β βββ apiResponse.js
β βββ /database # Database connections and migrations
β β βββ migrations/
β β βββ seeders/
β β βββ connection.js
β βββ /tests # Unit & integration tests
β β βββ auth.test.js
β β βββ user.test.js
β βββ app.js # App initialization
β βββ server.js # Server entry point
βββ /public # Static files
βββ /views # Templating engine views (if applicable)
βββ .env # Environment variables
βββ .gitignore # Git ignore file
βββ package.json # Project metadata & dependencies
βββ README.md # Documentation
This architecture mimics a framework and allows scalability like a full-fledged system.
/config
β Centralized configuration files./loaders
β Handles Express, database, security, etc., ensuring modular startup./modules
(Feature-Based Structure)- Each module (Auth, User, Order) is self-contained.
- Contains:
controller.js
β Handles HTTP requests.service.js
β Business logic layer.routes.js
β Defines Express routes.model.js
β Database schema/model.middleware.js
β Module-specific middleware.
/middlewares
β Global middlewares like authentication and validation./shared
β Reusable helpers (e.g., JWT, logging, API response formatting)./database
β Handles database connection, migrations, and seeders./tests
β Organized test structure for unit/integration testing.server.js
β Starts the application.
const express = require("express");
const loaders = require("./src/loaders/express");
const database = require("./src/loaders/database");
async function startServer() {
await database.connect(); // Initialize DB
const app = express();
loaders(app); // Initialize middlewares, routes, etc.
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`π Server running on port ${PORT}`));
}
startServer();
const express = require("express");
const cors = require("cors");
const helmet = require("helmet");
const morgan = require("morgan");
const authRoutes = require("../modules/auth/auth.routes");
const userRoutes = require("../modules/user/user.routes");
module.exports = (app) => {
app.use(cors());
app.use(helmet());
app.use(morgan("dev"));
app.use(express.json());
// Register routes
app.use("/api/auth", authRoutes);
app.use("/api/users", userRoutes);
};
const AuthService = require("./auth.service");
exports.login = async (req, res, next) => {
try {
const { email, password } = req.body;
const token = await AuthService.authenticate(email, password);
res.status(200).json({ success: true, token });
} catch (error) {
next(error);
}
};
const UserModel = require("../user/user.model");
const jwtHelper = require("../../shared/jwt.helper");
exports.authenticate = async (email, password) => {
const user = await UserModel.findOne({ email });
if (!user || user.password !== password) throw new Error("Invalid credentials");
return jwtHelper.generateToken(user);
};
fs.readdirSync(__dirname).forEach((file) => {
if (file !== "index.js" && file.endsWith(".routes.js")) {
const route = require(path.join(__dirname, file));
app.use("/api", route);
}
});
β
Modular & Scalable β Feature-based architecture for large applications.
β
Separation of Concerns β Clear division between routes, controllers, and services.
β
Easy to Maintain β Each module is self-contained and easy to extend.
β
Security & Performance β Uses helmet
, cors
, and morgan
.
β
Database Flexibility β Supports MongoDB (Mongoose) or SQL (Sequelize/TypeORM).
β
Testing-Ready β Structured for easy unit/integration testing.