Home Web Front-end JS Tutorial Introduction to common basic design patterns in Node.js

Introduction to common basic design patterns in Node.js

Sep 20, 2017 am 09:25 AM
javascript node.js Design Patterns

The first thing that comes to mind when everyone talks about design patterns is singletons, observers (observers) or factories (factory methods). This article focuses on introducing the implementation methods of some basic patterns in Node.JS. Interested friends can follow the editor of Script House to learn together

When it comes to design patterns, you may think of singletons and observers (observers) Or factories (factory methods). This article does not discuss them specifically. Just explore the implementation of some basic patterns in Node.JS, like dependency injection or middleware.

What are design patterns?

Design patterns are reusable solutions used to solve general, commonly occurring problems.

Singletons (Singleton)

The Singletons pattern limits a "class" to only one instance. Creating a singleton in Node.js is very simple, such as the require below.


//area.js
var PI = Math.PI;
function circle (radius) { 
 return radius * radius * PI;
}
module.exports.circle = circle;
Copy after login

It doesn’t matter how many times you reference it; it will only exist as a single instance.


var areaCalc = require('./area');
console.log(areaCalc.circle(5));
Copy after login

Singletons are probably the most common Node.js design pattern in NPM modules due to this implementation of require.

Observers

An object that maintains a listening/observation list and automatically notifies them when the state changes. In order to implement the observer pattern, EventEmitter comes in handy.


// MyFancyObservable.js
var util = require('util'); 
var EventEmitter = require('events').EventEmitter;
function MyFancyObservable() { 
 EventEmitter.call(this);
}
util.inherits(MyFancyObservable, EventEmitter);
Copy after login

That’s it; we have implemented an observable object! To use it, let's add some methods.


MyFancyObservable.prototype.hello = function (name) { 
 this.emit('hello', name);
};
Copy after login

Great, try listening and responding to this event!


var MyFancyObservable = require('MyFancyObservable'); 
var observable = new MyFancyObservable();
observable.on('hello', function (name) { 
 console.log(name);
});
observable.hello('john');
Copy after login

Factories (Factory method)

Factory pattern is a creator pattern and does not require We use constructors, which provide a common interface for creating objects. This pattern can be used to generate objects that are very complex to create.


function MyClass (options) { 
 this.options = options;
}
function create(options) { 
 // modify the options here if you want
 return new MyClass(options);
}
module.exports.create = create;
Copy after login

Factories can make testing easier because you can inject dependencies into them.

Dependency Injection Dependency Injection

Dependency injection is to inject one or more dependencies (or services) into the Design pattern for dependent objects.

In this example, we will create a usermodel which obtains database dependencies.


function userModel (options) { 
 var db;
 if (!options.db) {
  throw new Error('Options.db is required');
 }
 db = options.db;
 return {
  create: function (done) {
   db.query('INSERT ...', done);
  }
 }
}
module.exports = userModel;
Copy after login

Now, we use it to create an instance:


var db = require('./db');
var userModel = require('User')({ 
 db: db
});
Copy after login

Why is it useful? It makes testing easier - when you write unit tests, you can inject fake database instances into the model.

Middlewares/pipelinesMiddlewares/pipelines

Middleware is a powerful yet simple concept: the output of one functional unit is the output of the next input to the functional unit. If you've used Express then you've already used this pattern.

Let's take a look at how Koa does it:


app.use = function(fn){ 
 this.middleware.push(fn);
 return this;
};
Copy after login

So basically when you add a middleware, it's just pushed into a in the middleware queue. But what happens when a request arrives at this server?


var i = middleware.length; 
while (i--) { 
 next = middleware[i].call(this, next);
}
Copy after login

Nothing magical - your middleware is called one after the other.

Streams

You can treat streams as special pipes. It is more suitable for processing large data streams, that is, they are bytes, not objects.


process.stdin.on('readable', function () { 
  var buf = process.stdin.read(3);
  console.dir(buf);
  process.stdin.read(0);
});
Copy after login

The above is the detailed content of Introduction to common basic design patterns in Node.js. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

The difference between design patterns and architectural patterns in Java framework The difference between design patterns and architectural patterns in Java framework Jun 02, 2024 pm 12:59 PM

In the Java framework, the difference between design patterns and architectural patterns is that design patterns define abstract solutions to common problems in software design, focusing on the interaction between classes and objects, such as factory patterns. Architectural patterns define the relationship between system structures and modules, focusing on the organization and interaction of system components, such as layered architecture.

Analysis of the Decorator Pattern in Java Design Patterns Analysis of the Decorator Pattern in Java Design Patterns May 09, 2024 pm 03:12 PM

The decorator pattern is a structural design pattern that allows dynamic addition of object functionality without modifying the original class. It is implemented through the collaboration of abstract components, concrete components, abstract decorators and concrete decorators, and can flexibly expand class functions to meet changing needs. In this example, milk and mocha decorators are added to Espresso for a total price of $2.29, demonstrating the power of the decorator pattern in dynamically modifying the behavior of objects.

How design patterns deal with code maintenance challenges How design patterns deal with code maintenance challenges May 09, 2024 pm 12:45 PM

Design patterns solve code maintenance challenges by providing reusable and extensible solutions: Observer Pattern: Allows objects to subscribe to events and receive notifications when they occur. Factory Pattern: Provides a centralized way to create objects without relying on concrete classes. Singleton pattern: ensures that a class has only one instance, which is used to create globally accessible objects.

PHP design pattern practical case analysis PHP design pattern practical case analysis May 08, 2024 am 08:09 AM

1. Factory pattern: Separate object creation and business logic, and create objects of specified types through factory classes. 2. Observer pattern: allows subject objects to notify observer objects of their state changes, achieving loose coupling and observer pattern.

Comparison of Golang and Node.js in backend development Comparison of Golang and Node.js in backend development Jun 03, 2024 pm 02:31 PM

Go and Node.js have differences in typing (strong/weak), concurrency (goroutine/event loop), and garbage collection (automatic/manual). Go has high throughput and low latency, and is suitable for high-load backends; Node.js is good at asynchronous I/O and is suitable for high concurrency and short requests. Practical cases of the two include Kubernetes (Go), database connection (Node.js), and web applications (Go/Node.js). The final choice depends on application needs, team skills, and personal preference.

PHP Design Patterns: Test Driven Development in Practice PHP Design Patterns: Test Driven Development in Practice Jun 03, 2024 pm 02:14 PM

TDD is used to write high-quality PHP code. The steps include: writing test cases, describing the expected functionality and making them fail. Write code so that only the test cases pass without excessive optimization or detailed design. After the test cases pass, optimize and refactor the code to improve readability, maintainability, and scalability.

The wonderful use of the adapter pattern in Java design patterns The wonderful use of the adapter pattern in Java design patterns May 09, 2024 pm 12:54 PM

The Adapter pattern is a structural design pattern that allows incompatible objects to work together. It converts one interface into another so that the objects can interact smoothly. The object adapter implements the adapter pattern by creating an adapter object containing the adapted object and implementing the target interface. In a practical case, through the adapter mode, the client (such as MediaPlayer) can play advanced format media (such as VLC), although it itself only supports ordinary media formats (such as MP3).

Application of design patterns in Guice framework Application of design patterns in Guice framework Jun 02, 2024 pm 10:49 PM

The Guice framework applies a number of design patterns, including: Singleton pattern: ensuring that a class has only one instance through the @Singleton annotation. Factory method pattern: Create a factory method through the @Provides annotation and obtain the object instance during dependency injection. Strategy mode: Encapsulate the algorithm into different strategy classes and specify the specific strategy through the @Named annotation.

See all articles