What is NodeJS's design pattern?
Design patterns in Node.js, as in any other programming language or framework, are reusable solutions to common software design problems. They provide a template for how to structure and solve these problems, making development more efficient and the code more maintainable and scalable. Here are some popular design patterns that are often used in Node.js development:
1. Module Pattern
Use Case: Encapsulating “private” variables and functions. Node.js natively supports the module pattern through its module system, where each file is treated as a module.
Example: Using require() to include modules and exports or module.exports to expose module functionality.
2. Factory Pattern
Use Case: Creating objects without specifying the exact class of object that will be created. This is useful in situations where the creation logic might select from several different classes.
Example: A function that returns an instance of one of several possible classes based on input parameters.
3. Singleton Pattern
Use Case: Ensuring a class has only one instance and providing a global point of access to it. This can be useful for managing resources such as database connections.
Example: Using a global variable to store the instance and wrapping the class constructor to return the existing instance if it exists.
4. Observer Pattern
Use Case: Allowing a subscription model for handling events where subscribers are notified of changes to the subject they are observing. Node.js events and streams effectively use this pattern.
Example: Using Node.js’s EventEmitter to create publishers and subscribers.
5. Strategy Pattern
Use Case: Enabling the selection of an algorithm at runtime. Instead of implementing a single algorithm directly, code receives run-time instructions as to which in a family of algorithms to use.
Example: Functions that accept behavior through parameters, or setting the behavior of an object at runtime.
6. Middleware Pattern
Use Case: Intercepting and potentially modifying requests and responses in web applications. Widely used in web servers and applications.
Example: Express.js uses middleware to process HTTP requests by chaining functions together.
7. Decorator Pattern
Use Case: Adding new functionality to objects without altering their structure. This can be particularly useful in a dynamic language like JavaScript where objects can be modified at runtime.
Example: Wrapping functions with additional behavior without modifying the original function directly.
Implementing Design Patterns in Node.js
The implementation of these patterns in Node.js relies on JavaScript’s capabilities, such as closures, functions as first-class citizens, and prototype-based inheritance. Here’s a simple example of the Module Pattern, as it’s one of the most commonly used patterns in Node.js:
// loggerModule.js const log = (message) => { console.log([Log]: ${message}); }; module.exports = log; // app.js const logger = require('./loggerModule'); logger('This is a test log.');
In this example, loggerModule.js exports a log function that can be used in other parts of the application. This encapsulates the logging logic and can be considered a simple implementation of the Module Pattern.
Each design pattern serves different needs and scenarios. Choosing the right pattern depends on the specific problem you’re trying to solve, the application’s architecture, and its scalability requirements.
The series
Each pattern gets its own hands-on post with runnable examples:
- Factory Pattern, creating the right object for the situation
- Singleton Pattern, one shared instance, done deliberately
- Observer Pattern, the pattern underneath EventEmitter
- Strategy Pattern, replacing if-else chains with interchangeable algorithms
- Middleware Pattern, pipelines of single-purpose functions
- Decorator Pattern, adding behavior without editing working code
- Module Pattern, encapsulation the JavaScript way
- OOP in Node.js, the object model as actually practiced
These are the patterns I kept meeting in real codebases across years of Node.js work, integrations, Shopify apps, backend services. The write-ups are deliberately compact: the concept, when it earns its place, and code you can run.

Nguyễn Hải Nam
Project Management Lead. 16+ years from code to delivery. PMP®. Writing here about project management and engineering.