Skip to Content
GuidesFolder Structure

Folder Structure

Each NodeBuilder template follows a clean, predictable structure designed for scalability and clarity.
This layout makes it easy to add routes, controllers, services, and utilities without clutter.


Typical Project Layout

<project-root>/ ├── package.json ├── server.js └── src/ ├── app.js ├── config/ ├── controllers/ ├── models/ ├── routes/ ├── services/ ├── middleware/ └── utils/

Root Files

FilePurpose
package.jsonDeclares dependencies, scripts, and project metadata.
server.jsEntry point — loads Express app, connects DB, and starts the server.
.env / .env.exampleEnvironment variables for local and production configs.

[!TIP] You can rename server.js to index.js or main.js if you prefer, as long as package.json scripts are updated accordingly.


/src Directory

This is where all your backend logic lives.

src/app.js

The core Express configuration file. Includes middleware setup, route registration, and error handling. Markers like // ROUTE_IMPORTS_START are used internally for optional CRUD removal.

src/config/

Houses configuration modules:

  • db.js → MongoDB or database connection
  • logger.js → Winston or console logger
  • socket.js → Socket.IO initialization (in real-time templates)

Add your own config files here (e.g., Redis, mail, or caching).

src/controllers/

Contains request handler logic. Each controller matches a route and interacts with models/services. Example: user.controller.js, todo.controller.js.

src/models/

Defines Mongoose schemas or database models. Example:

const UserSchema = new mongoose.Schema({ name: String, email: String })

src/routes/

Express routers that map endpoints to controllers. Example:

router.get('/users', getUsers) router.post('/users', createUser)

[!TIP] Keep route definitions simple — offload logic to controllers or services.

src/services/

Reusable business logic and helpers — usually database or API interaction code. Example: user.service.js handles queries, validation, or aggregation logic.

src/middleware/

Middleware used globally or per-route:

  • auth.middleware.js — JWT or session validation
  • error.middleware.js — global error handler
  • validate.middleware.js — schema validation (e.g., Joi)

src/utils/

Utility functions and helper classes. Includes things like:

  • ApiResponse.js, ApiError.js
  • CatchAsync.js, Token.js
  • Response or formatting helpers

Template Variations

TemplateNotable Extras
BasicMinimal setup with optional Todo CRUD.
REST APIIncludes services, auth, and schema validation layers.
Socket.IOAdds src/config/socket.js and real-time event wiring.

Extending the Structure

You can safely add new folders:

src/ ┣ jobs/ # Background or scheduled tasks ┣ scripts/ # CLI scripts (e.g. database seeding) ┗ validators/ # Custom schema validators

[!NOTE] NodeBuilder doesn’t enforce structure beyond the basics — you can freely add or rename modules to fit your workflow.


Example Flow

Typical request flow in a REST API template:

Route → Controller → Service → Model → Response

Each layer handles one responsibility:

  • Routes define endpoints
  • Controllers manage request logic
  • Services handle database or external API logic
  • Models define data structure
  • Utils handle formatting and response output

✅ Summary

FolderPurpose
config/Environment, database, logger, socket setup
controllers/Request handlers
models/Database schemas
routes/API endpoints
services/Business logic
middleware/Request interceptors
utils/Shared helpers and error classes

[!TIP] The folder structure is consistent across all templates — once you learn one, you know them all. Customize and extend as needed for your project’s complexity!

Last updated on