Node.js事件驱动架构

Node.js事件驱动架构

1.什么是事件?什么是事件驱动架构?

**事件:**可以理解为发生事件的信号,它代表系统内部或外部状态的改变,比如文件读取完毕了,收到了HTTP请求等等

**事件驱动架构:**程序的执行流程主要由事件来决定。不再是传统的"从上到下顺序执行完就结束":而是:

  1. 先声明当事件发生,执行什么函数;
  2. 然后程序就会进入一个事件循环,我们上次说的,不断的等待事件的发生;
  3. 事件到来时,取出对用的回调函数,然后执行它;

流程可以使用下面的方式来展示

2. EventEmitter类

这个类是Node.js的基石,很多核心模块都继承这个类,例如http、fs、stream、process等等,它是用于创建、触发和监听自定义事件的;

基础用法

这里我们演示一下基本的发布-订阅模式;首先我们引入events模块,这个模块提供了EventEmitter类,后面我们将用这个类来创建自定义的时间发射器

node 复制代码
const EventEmitter = require('events');
  • 接下来我们可以直接使用这个类,但是一般情况下我们都是定义一个自定义的类来继承,这样后续我们可以添加自己的方法或者属性;继承可以让我们拥有EventEmitter的所有能力,比如on或者emit等方法
js 复制代码
class MyEmitter extends EventEmitter {}
  • 然后我们就直接实例化发射器,来注册一下监听器、触发事件
js 复制代码
const myEmitter = new MyEmitter();
  • 之后我们绑定事件监听器
js 复制代码
myEmitter.on('data', (msg) => {
  console.log(`收到数据:${msg}`);
});

on方法就相当于addListener,为指定事件注册一个监听器函数;

  • 下一步就来触发事件吧
js 复制代码
myEmitter.emit('data', '即将成为Node.js大神');

emit方法用于触发一个事件

列举一下常用方法

  • on/addListener:绑定事件处理函数
  • once:只监听一次,触发后自动移除
  • off/removeListener:移除指定监听器
  • emit:触发事件,按注册顺序同步调用所有监听器
  • listenerCount:返回当前事件监听器数量
  • removeAllListeners:移除所有监听器

这里的emit是同步调用监听器的,大量的监听器同步执行的话可能会阻塞事件循环

EventEmitter核心特性

** EventEmitter 一个非常核心的特性:同一个事件可以绑定多个监听器,它们会被依次调用,而不会相互覆盖。**

js 复制代码
const server = http.createServer();

server.on('request', (req, res) => {
  console.log('Request received');
  res.end('Request received');
});

server.on('request', (req, res) => {
  console.log('Another request');
});

server.on('close', () => {
  console.log('Server closed');
});

server.listen(8000, '127.0.0.1', () => {
  console.log('Waiting for requests ...');
});
  • http.createServer返回的server对象继承自EventEmitter.
  • 两次调用.on不会让第二个覆盖第一个,而是注册了两个独立的监听函数;
  • 当一个HTTP请求到达时,这两个函数会按注册顺序依次执行

这个是EventEmitter和普通回调函数最大的不通,事件是可以一对多的;

我们来实际运行一下

  1. 当我启动服务后访问http://127.0.0.1:8000,第一个监听器会被执行,打印Request received,调用res.end,向客户端发送响应,并关闭连接
  2. 第二个监听器执行;

所以,EventEmitter可以为同一个事件注册多个监听器,它们依次执行,互不覆盖。

相关推荐
FungLeo31 分钟前
成为全栈·Node 后端篇·接口文档自动化:让 OpenAPI 与代码不脱节
node.js·openapi·成为全栈·接口文档自动化
2601_9539880734 分钟前
Ricon组态实时监控 - 毫秒级数据可视化
前端·物联网·数学建模·信息可视化·架构·前端框架
万岳科技程序员小金1 小时前
同城O2O外卖系统源码开发详解:从APP、小程序到后台管理平台的完整架构解析
小程序·架构·同城外卖系统源码·外卖app开发·外卖小程序开发·外卖软件开发·外卖平台搭建
这个DBA有点耶1 小时前
时间序列数据库选型2026:5款主流产品深度对比与场景适配
大数据·数据库·程序人生·架构·时序数据库·dba·数据库管理员
张彦峰ZYF2 小时前
从“记住对话”到“经营组织经验”:TencentDB Agent Memory 的团队级记忆架构、工程取舍与企业落地边界
人工智能·架构·llm·agent·skill·agent memory·tencentdb
右耳朵猫AI2 小时前
Node.js周刊2026W36 | NestJS 12发布、Remix 3 RC、pnpm 12 Rust重写、Node.js 26.8.0
开发语言·rust·node.js
www_aiyuanma_vip2 小时前
实验室设备借用系统
node.js
右耳朵猫AI2 小时前
Web前端周刊2026W36 | pnpm 12 Rust 重写、Remix 3 RC、Node.js 26.8.0、htmx 4.0 大版本
前端·rust·node.js
国科安芯2 小时前
基于抗辐射MCU的卫星分布式控制系统CANFD总线架构研究
网络·人工智能·分布式·单片机·嵌入式硬件·架构·抗辐射
颜料_vic11 小时前
coze中OpenClaw入门教程:“龙虾”的概念和架构解析
架构