Table of Contents
1. Initial use
Home Web Front-end JS Tutorial The built-in module event of Node.js, how to use it to implement the publish and subscribe model

The built-in module event of Node.js, how to use it to implement the publish and subscribe model

Sep 23, 2022 pm 08:11 PM
nodejs​ node.js node

Everyone must be familiar with the publish-subscribe model. It plays a great role in asynchronous interaction and can make our code structure clearer, easier to read, and easier to maintain.

The built-in module event of Node.js, how to use it to implement the publish and subscribe model

In node we can use built-in moduleevent To implement the publish-subscribe model, in this article we will learn in depth event and demonstrate its role in our actual development, let's get started! [Related tutorial recommendations: nodejs video tutorial]

1. Initial use

Introducing the event built-in module

// 引入内置模块event
const EventEmitter = require("events");
Copy after login

Create event object

##eventThe built-in module is essentially a constructor, we You need to call it through the new operator

// 创建event对象
const event = new EventEmitter();
Copy after login

Listen for events

Use

eventThe on function on the object defines a listening event. The syntax is: event.on(event name, event processing function)

// 监听run事件
event.on("run", (data) => {
    console.log("run事件运行,参数为:", data);
});
Copy after login

Trigger events

Use the emit function on the

event object to trigger the monitored event. The syntax is: event.emit (name of the event that needs to be triggered) , parameters that need to be passed to the event processing function)

// 触发run事件
event.emit("run", "111111");
Copy after login

Complete code

// 引入内置模块event
const EventEmitter = require("events");
// 创建event对象
const event = new EventEmitter();

// 监听run事件
event.on("run", (data) => {
    console.log("run运行,参数为:", data);
});

// 触发run事件
event.emit("run", "111111");
Copy after login

Running result:

The built-in module event of Node.js, how to use it to implement the publish and subscribe model

❗️ Problem with repeated event monitoring

==Note: When the same event is monitored multiple times When an event is triggered, all event processing functions of this event will be triggered at the same time==

The built-in module event of Node.js, how to use it to implement the publish and subscribe model

2. Apply

in the previous step Section

Node.js | Build a back-end server (including the use of built-in module http | url | querystring) There is one that uses node to simulate get requests (forwarding across Domain data) case:

const http = require("http");
const https = require("https");
// http和https的区别仅在于一个是http协议一个是https协议
const url = require("url");

const server = http.createServer();

server.on("request", (req, res) => {
    const urlObj = url.parse(req.url, true);

    res.writeHead(200, {
        "content-type": "application/json;charset=utf-8",
        "Access-Control-Allow-Origin": "http://127.0.0.1:5500",
    });

    switch (urlObj.pathname) {
        case "/api/maoyan":
            // 我们定义的httpget方法:使node充当客户端去猫眼的接口获取数据
            httpget((data) => res.end(data)); // 注意这里
            break;

        default:
            res.end("404");
            break;
    }
});

server.listen(3000, () => {
    console.log("服务器启动啦!");
});

function httpget(cb) {
    // 定义一个存放数据的变量
    let data = "";
    // 因为猫眼的接口是https协议的,所以我们需要引入https
    // http和https都具有一个get方法能够发起get请求,区别是一个是http协议,一个是https协议
    // http get方法第一个参数为接口地址,第二个参数为回调函数
    https.get(
        "https://i.maoyan.com/api/mmdb/movie/v3/list/hot.json?ct=%E8%A5%BF%E5%8D%8E&ci=936&channelId=4",
        (res) => {
            // http get方法获取的数据是一点点返回的,并不是直接返回全部
            // 监听data,当有数据返回时就会被调用
            res.on("data", (chunk) => {
                // 收集数据
                data += chunk;
            });
            // 监听end,数据返回完毕后调用
            res.on("end", () => {
                cb(data); // 注意这里
            });
        }
    );
}
Copy after login
Pay attention to lines 19 and 49 of the above code:

httpget((data) => res.end(data)); // 注意这里
Copy after login
cb(data); // 注意这里
Copy after login
In this example, we pass it in the

httpget function Enter a callback function to receive the data obtained by the httpget function. This writing method is actually no problem and is often used in development.

But in some cases, especially when

multi-layer nested function calls (such as the example below), this writing method is not elegant enough because its code structure is not very clear. , cannot understand its logic very intuitively:

function user() {
    getUser((data) => {
        console.log(data);
    });
}

function getUser(cb) {
    // ....
    const id = 1;
    getUserInfo(cb, id);
}

function getUserInfo(cb, id) {
    // ....
    const name = id + "Ailjx";
    cb(name);
}
Copy after login
Let us use the built-in module

event to transform the above nodesimulationget request ( Case of forwarding cross-domain data):

const http = require("http");
const https = require("https");
const url = require("url");
const EventEmitter = require("events");
const server = http.createServer();

// 存放event对象
let event = "";

server.on("request", (req, res) => {
    const urlObj = url.parse(req.url, true);

    res.writeHead(200, {
        "content-type": "application/json;charset=utf-8",
        "Access-Control-Allow-Origin": "http://127.0.0.1:5500",
    });

    switch (urlObj.pathname) {
        case "/api/maoyan":
            event = new EventEmitter(); // 注意该位置
            // 监听事件
            event.on("resEnd", (data) => {
                res.end(data);
            });
            httpget();
            break;

        default:
            res.end("404");
            break;
    }
});

server.listen(3000, () => {
    console.log("服务器启动啦!");
});

function httpget() {
    let data = "";
    https.get(
        "https://i.maoyan.com/api/mmdb/movie/v3/list/hot.json?ct=%E8%A5%BF%E5%8D%8E&ci=936&channelId=4",
        (res) => {
            res.on("data", (chunk) => {
                data += chunk;
            });
            res.on("end", () => {
                // 触发事件并传递数据
                event.emit("resEnd", data);
            });
        }
    );
}
Copy after login
Run and call

/api/maoyan interface:

The built-in module event of Node.js, how to use it to implement the publish and subscribe model

Interface is normal Use

. Pay attention to the position of the above code new EventEmitter(). If new EventEmitter() is external, it is equivalent to There is only one global event object. Every time we call the /api/maoyan interface, node will listen to a new resEnd event, this will cause the resEnd event to be repeatedly listened to:

The built-in module event of Node.js, how to use it to implement the publish and subscribe model

So we need to create the

eventThe code of the objectnew EventEmitter() is written to the case branch of the interface, so that when we call this interface, a new event object will be created , old event objects that are deprecated will be processed by the JS garbage processing mechanism, so that there will be no problem of resEnd events being monitored repeatedly

For more node-related knowledge, please visit:

nodejs tutorial!

The above is the detailed content of The built-in module event of Node.js, how to use it to implement the publish and subscribe model. 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)

Detailed graphic explanation of the memory and GC of the Node V8 engine Detailed graphic explanation of the memory and GC of the Node V8 engine Mar 29, 2023 pm 06:02 PM

This article will give you an in-depth understanding of the memory and garbage collector (GC) of the NodeJS V8 engine. I hope it will be helpful to you!

An article about memory control in Node An article about memory control in Node Apr 26, 2023 pm 05:37 PM

The Node service built based on non-blocking and event-driven has the advantage of low memory consumption and is very suitable for handling massive network requests. Under the premise of massive requests, issues related to "memory control" need to be considered. 1. V8’s garbage collection mechanism and memory limitations Js is controlled by the garbage collection machine

How to use express to handle file upload in node project How to use express to handle file upload in node project Mar 28, 2023 pm 07:28 PM

How to handle file upload? The following article will introduce to you how to use express to handle file uploads in the node project. I hope it will be helpful to you!

Let's talk in depth about the File module in Node Let's talk in depth about the File module in Node Apr 24, 2023 pm 05:49 PM

The file module is an encapsulation of underlying file operations, such as file reading/writing/opening/closing/delete adding, etc. The biggest feature of the file module is that all methods provide two versions of **synchronous** and **asynchronous**, with Methods with the sync suffix are all synchronization methods, and those without are all heterogeneous methods.

An in-depth analysis of Node's process management tool 'pm2” An in-depth analysis of Node's process management tool 'pm2” Apr 03, 2023 pm 06:02 PM

This article will share with you Node's process management tool "pm2", and talk about why pm2 is needed, how to install and use pm2, I hope it will be helpful to everyone!

Pi Node Teaching: What is a Pi Node? How to install and set up Pi Node? Pi Node Teaching: What is a Pi Node? How to install and set up Pi Node? Mar 05, 2025 pm 05:57 PM

Detailed explanation and installation guide for PiNetwork nodes This article will introduce the PiNetwork ecosystem in detail - Pi nodes, a key role in the PiNetwork ecosystem, and provide complete steps for installation and configuration. After the launch of the PiNetwork blockchain test network, Pi nodes have become an important part of many pioneers actively participating in the testing, preparing for the upcoming main network release. If you don’t know PiNetwork yet, please refer to what is Picoin? What is the price for listing? Pi usage, mining and security analysis. What is PiNetwork? The PiNetwork project started in 2019 and owns its exclusive cryptocurrency Pi Coin. The project aims to create a one that everyone can participate

Let's talk about the event loop in Node Let's talk about the event loop in Node Apr 11, 2023 pm 07:08 PM

The event loop is a fundamental part of Node.js and enables asynchronous programming by ensuring that the main thread is not blocked. Understanding the event loop is crucial to building efficient applications. The following article will give you an in-depth understanding of the event loop in Node. I hope it will be helpful to you!

Learn more about Buffers in Node Learn more about Buffers in Node Apr 25, 2023 pm 07:49 PM

At the beginning, JS only ran on the browser side. It was easy to process Unicode-encoded strings, but it was difficult to process binary and non-Unicode-encoded strings. And binary is the lowest level data format of the computer, video/audio/program/network package

See all articles