Node.js 中的事件驱动架构

Node.js 中的事件驱动架构

事件驱动架构 (EDA) 已成为构建可扩展、响应式和松散耦合系统的强大范例。在 Node.js 中,EDA 发挥着关键作用,利用其异步特性和事件驱动功能来创建高效且健壮的应用程序。让我们深入研究 Node.js 中事件驱动架构的复杂性,探索其核心概念、优点和实际示例。

Node.js 事件驱动架构中的关键模块:

EventEmitter

Node.js 事件驱动架构的核心是 EventEmitter 模块,它支持创建能够发出和处理事件的对象。该模块是将事件驱动模式集成到应用程序中的基本元素。EventEmitter 的主要功能包括:

  • 事件注册:从EventEmitter继承的对象可以为他们希望跟踪的特定事件注册事件侦听器。这涉及将函数(侦听器)与指定的事件名称相关联。

  • 事件触发:利用EventEmitter中的emit()方法,实例可以触发事件,指示特定的操作或状态变化。这会触发分配给该事件的所有已注册侦听器的调用。

  • 自定义事件:开发人员能够在其应用程序中制作自定义事件,定义唯一的事件名称来表示不同的系统操作或事件。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
// 定义自定义事件
myEmitter.on('customEvent', (arg1, arg2) => {console.log('Event received with arguments:', arg1, arg2);
});
// 触发自定义事件
myEmitter.emit('customEvent', 'Hello', 'World');

在此示例中,创建了一个继承自 EventEmitter 的自定义 MyEmitter 类。为customEvent事件添加了一个事件侦听器,该事件侦听器记录使用 emit() 发出事件时接收到的参数。

Event

Node.js 中,Event代表在应用程序中确认和管理的重要事件,封装了系统状态中的不同操作或修改。事件的主要特征包括:

  • 事件类型:事件包含各种操作或转换,包括数据更新、用户交互、系统错误或生命周期事件。

  • 事件命名:事件通常由传达其目的或性质的字符串来标识。使用清晰且描述性的事件名称可以促进更好的理解和代码库的可维护性。

  • 事件有效负载:事件具有携带补充数据或信息的能力,称为事件有效负载。这些数据与事件一起传输,使听众能够利用从事件中获取的上下文信息来执行特定的操作。

const http = require('http');
const server = http.createServer((req, res) => {if (req.url === '/home') {res.writeHead(200, { 'Content-Type': 'text/plain' });res.end('Welcome to the home page!');} else if (req.url === '/about') {res.writeHead(200, { 'Content-Type': 'text/plain' });res.end('About us page.\n');} else {res.writeHead(404, { 'Content-Type': 'text/plain' });res.end('Page not found!');}
});
// Listening for the 'request' event
server.on('request', (req, res) => {console.log(`Request received for URL: ${req.url}`);
});
server.listen(3000, () => {console.log('Server running on port 3000');
});

在此示例中,HTTP 服务器每次收到请求时都会发出request事件。on() 方法用于侦听此事件,从而启用对请求的URL进行记录。

Listeners

Listeners侦听器作为与特定事件链接的函数,会响应相应事件的触发而激活。Listeners的关键方面包括:

  • 事件绑定:侦听器通过 EventEmitter 提供的 on()addListener() 方法建立与事件的连接。这些函数用于对发射器发出的特定事件做出反应。
  • 侦听器的执行:发出事件后,为该事件设计的所有注册侦听器都会按顺序执行,从而促进多个函数对同一事件的发生做出反应。
  • 侦听器参数:发出事件后,为该事件设计的所有注册侦听器都会按顺序执行,从而促进多个函数对同一事件的发生做出反应。
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// Listener 1 for 'eventA'
myEmitter.on('eventA', () => {console.log('Listener 1 for eventA executed');
});
// Listener 2 for 'eventA'
myEmitter.on('eventA', () => {console.log('Listener 2 for eventA executed');
});
// Emitting 'eventA'
myEmitter.emit('eventA');

在此示例中,为eventA注册了两个侦听器。当使用emit() 发出事件时,两个侦听器将按照它们注册的顺序依次执行。

Node.js 中事件驱动架构的优点

异步处理和非阻塞IO:

Node.js 以其异步特性而闻名,它与 EDA 无缝互补。EDA 通过启用非阻塞事件处理来利用这一点。当事件发生时,Node.js 可以同时有效地管理这些事件,而无需等待每个操作完成。

松耦合和模块化:

EDA 促进应用程序不同组件之间的松散耦合。组件通过事件进行通信,减少了它们之间的直接依赖关系。这种松散的耦合允许更大的模块化,因为组件可以独立运行,从而使系统更易于维护并且更容易扩展或修改。

可扩展性和响应能力:

Node.js 事件驱动模型对应用程序的可扩展性做出了重大贡献。跨多个侦听器或订阅者分发事件的能力可以实现更好的负载分配和资源利用。

增强的错误处理和弹性:

EDA 有助于 Node.js 应用程序中强大的错误处理。通过发出特定的错误事件,组件可以传达故障或异常情况,从而允许系统的其他部分做出相应的响应。

实时通信和事件驱动的数据流:

在需要实时通信或数据流的场景中,例如聊天应用程序或物联网系统,Node.js 中的 EDA 表现出色。事件驱动的方法允许系统不同部分之间的实时无缝通信。

灵活性和可扩展性:

EDA 培育了一种灵活的架构,可以适应未来的变化和扩展。可以通过引入新事件或侦听器来添加新功能或特性,而无需中断现有组件。

实例

实时聊天应用程序

想象一下使用 Node.jssocket/io 构建一个实时聊天应用程序,多个用户可以立即交换消息。这是一个简化的演示。

const http = require('http');
const express = require('express');
const socketIO = require('socket.io');const app = express();
const server = http.createServer(app);
const io = socketIo(server);// 监听连接
io.on('connection', (socket) => {// 处理收到的消息socket.on('message', (message) => {// 广播发送消息socket.broadcast.emit('message', message);});
});server.listen(8080, () => {console.log('Server running on port 8080');
});

在此示例中,SocketIO 服务器(SocketIO Server 的实例)侦听连接。当客户端连接时,会发出一个事件。随后,服务器侦听来自客户端的传入消息,并发出message事件。

事件驱动的文件系统监控

考虑一个场景,我们需要使用 Node.js 监控目录中的文件更改。

const fs = require('fs');
const EventEmitter = require('events');
class FileWatcher extends EventEmitter {watchDir(directory) {fs.watch(directory, (eventType, filename) => {if (eventType === 'change') {this.emit('fileChanged', filename);}});}
}

在此示例中,创建了一个扩展 EventEmitterFileWatcher 实例。它使用 Node.jsfs.watch() 方法监视指定目录中的文件更改。当目录中发生change事件时,观察者会发出fileChanged事件。设置事件侦听器通过记录已更改的文件名来处理此事件。

使用 Express.js 处理 HTTP 请求

使用 Express.js 来扩展 HTTP 服务器示例来处理传入请求。

const express = require('express');
const app = express();
app.get('/', (req, res) => {res.send('Welcome to the home page!');
});
app.get('*', (req, res) => {res.status(404).send('Page not found!');
});
const server = app.listen(3000, () => {console.log('Server running on port 3000');
});
server.on('listening', () => {console.log('Server started!');
});

在此示例中,Express.js 本身利用事件驱动模式来定义路由并处理传入的 HTTP 请求。当向主路由(“/”)发出 GET 请求时,express 会发出request事件。类似地,对于其他路由,也会发出request事件。

结论

Node.js 中的事件驱动架构为开发人员提供了无数优势,支持创建高性能、可扩展且响应迅速的应用程序。通过利用异步处理、松耦合、可扩展性和实时通信,EDA 增强了架构的弹性、适应性和高效管理复杂任务的能力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/170695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java核心知识点整理大全14-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

CSS特效019:图标图片悬浮旋转一周

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

【数据结构实验】查找(二)基于线性探测法的散列表

文章目录 1. 引言2. 实验原理2.1 散列表2.2 线性探测法 3. 实验内容3.1 实验题目(一)输入要求(二)输出要求 3.2 算法实现三、实验设计3.3 代码整合 4. 实验结果 1. 引言 本实验将通过C语言实现基于线性探测法的散列表 2. 实验原理…

R语言期末复习一

创建一个长度为7的字符向量,元素为"A", "B", "C", "D", "E", "F", "G",并命名为vec1。 创建一个因子,包含6个水果:"apple", "banana"…

Kubernetes 秘密暴露使大型区块链公司面临风险

领先的网络安全专家对公开的 Kubernetes 配置表示担忧,这可能会威胁许多组织供应链的安全。 受影响的公司包括两家主要的区块链公司(出于安全原因,其名称已被隐去)以及其他多家财富 500 强公司。 Aqua Security 研究人员报告称&…

NX二次开发UF_CURVE_ask_joined_parms 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_joined_parms Defined in: uf_curve.h int UF_CURVE_ask_joined_parms(tag_t joined_curve_feature, UF_STRING_p_t uf_curve_string, int * creation_method, double …

力扣:单调栈算法思路题

单调栈分为单调递增栈和单调递减栈,通过使用单调栈我们可以访问到最近一个比它大(小)的元素。 🍊 单调递增栈:单调递增栈就是从栈底到栈顶数据是依次递增,通常是寻找某方向第一个比它小的元素。 &#x1f…

ESP32自定义OTA实现

ESP32 自定义实现OTA 一 相关头文件二 OTA流程三 初始化过程四 OTA过程注意事项 一 相关头文件 //----------------------------// OTA #include "esp_ota_ops.h" #include "esp_app_format.h" #include "esp_flash_partitions.h" #include &qu…

物联网后端个人第十二周总结

学习工作进度 物联网方面 1.模拟设备通过规则引擎将数据通过mqtt进行转发 在物联网平台上实现模拟设备通过规则引擎将数据通过mqtt进行转发已经全部完成了,所使用的物联网平台在这方面有不少的问题和bug,也可能是没有按照开发者的想法对平台进行使用才导…

MATLAB在信号系统中的应用

1.产生一个幅度为1, 基频为2Hz,占空比为50%的周期方波.要求画出图形。 在MATLAB中,函数square(w0*t, DUTY)产生基本频率为w0 (周期T2*pi/w0)、占空比DUTY (τ/T)*100的周期矩形波(方波),默认情况下占空比DUTY50。占空…

如何理解2023vivo开发者大会,使用Rust语言编写蓝河操作系统(BlueOS)?

在2023年vivo开发者大会上,vivo宣布使用Rust语言编写其蓝河操作系统(BlueOS)。 什么是Rust语言? Rust 是一种开放源代码系统编程语言,可用于开发高效、安全的软件。 使用 Rust 可管理内存并控制其低级详细信息。 但你…

微信小程序显示二维码?

wxml <canvas style"width: 100%;height: 100%;margin-left: 20%;" id"Canvase" type"2d"></canvas> js // pages/code/code.js Page({/*** 页面的初始数据*/data: {code: ,},/*** 生命周期函数--监听页面加载*/onLoad(options) {…

LLM之Agent(一):使用GPT-4开启AutoGPT Agent自动化任务完整指南

在ChatGPT引领的大模型时代&#xff0c;要想让大模型按照用户的指令执行&#xff0c;Prompt设计是一门艺术&#xff0c;由此还催生了一个职业”Prompt工程师“。其实&#xff0c;并不是所有人都可以设计出好的Prompt&#xff0c;甚至同样的Prompt应用在不同的大模型上表现的结果…

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训 在当今数字化时代&#xff0c;大数据技术的迅猛发展带来了前所未有的数据增长&#xff0c;同时也催生了对数据安全和网络安全的更为迫切的需求。本篇博客将聚焦于大数据技术背景下的数据安全与网络安全&#xff…

扫描条形码到电脑:Barcode to pc 4.6.3 Crack

像专业人士一样使用条形码将条形码发送到 PC 排名第一的智能手机扫描应用程序 将条形码即时发送到计算机程序并自动执行任务的最简单方法 受到全球 500,000 多名用户的信赖 条形码到 PC&#xff1a;Wi-Fi 扫描仪应用程序&#xff0c;条码到 PC&#xff1a;适用于 Android 和 i…

MidJourney笔记(3)-Prompts

MidJourney的Prompts介绍 MidJourney的Prompts是MidJourney的核心之一,这也是我们后续使用MidJourney过程中最重要的工作内容,根据生成的图片,不断的优化我们的Prompts内容。 那Prompts的中文意思是提示的意思。 Prompts的提示语有很多,最基础的用法就是: /imagine prompt…

【Web】[GKCTF 2021]easycms

直接点击登录按钮没有反应 扫目录扫出来/admin.php 访问 弱口令admin 12345直接登录成功 点开设计--主题--自定义 编辑页头&#xff0c;类型选择php源代码 点保存显示权限不够 设计--组件--素材库 先随便上传一个文件&#xff0c;之后改文件名称为../../../../../system/tmp…

一些可能被忽视的 Vue3 API 附带案例

Vue3 是 Vue.js 的最新版本&#xff0c;它引入了许多新的 API 和改进。以下是一些可能被忽视的 Vue3 API&#xff1a; reactive&#xff1a;这是 Vue3 中用于创建响应式对象的函数。与 Vue2 中的 data 不同&#xff0c;reactive 返回的对象是响应式的&#xff0c;这意味着当对…

JsonRPC协议详解(协议介绍、请求示例、响应示例)

JsonRPC协议详解 什么是RPC&#xff1f; RPC&#xff08;远程过程调用&#xff09;是一种用于实现分布式系统中不同进程或不同计算机之间通信的技术。它允许我们像调用本地函数一样调用远程计算机上的函数&#xff0c;使得分布式系统的开发变得更加简单和高效。 什么是JsonRP…

python之pycryptodome模块,加密算法库

一、简介 PyCryptodome是PyCrypto库的一个分支&#xff0c;它是Python中最受欢迎的密码学库之一。PyCryptodome提供了许多密码学算法和协议的实现&#xff0c;包括对称加密、非对称加密、消息摘要、密码哈希、数字签名等。它还提供了一些其他功能&#xff0c;如密码学安全随机…