全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-15 7 分钟 ✍️ juanwangdev

Node.js events 事件触发器模块

events 模块提供 EventEmitter 类,是 Node.js 事件驱动架构的基础。

引入模块

JavaScript
const EventEmitter = require('events');

创建事件发射器

JavaScript
const emitter = new EventEmitter();

// 注册事件监听器
emitter.on('message', (data) => {
  console.log('收到消息:', data);
});

// 触发事件
emitter.emit('message', 'Hello World');

EventEmitter 常用方法

方法说明
on(event, listener)注册监听器(可多次触发)
once(event, listener)注册一次性监听器
emit(event, ...args)触发事件
removeListener(event, listener)移除监听器
removeAllListeners([event])移除所有监听器
listeners(event)获取监听器列表
listenerCount(event)获取监听器数量

一次性监听器

JavaScript
emitter.once('connect', () => {
  console.log('首次连接');
});

emitter.emit('connect'); // 输出: 首次连接
emitter.emit('connect'); // 无输出,监听器已移除

移除监听器

JavaScript
function handler() {
  console.log('handler');
}

emitter.on('test', handler);

// 移除特定监听器
emitter.removeListener('test', handler);
// 或使用别名
emitter.off('test', handler);

// 移除某事件所有监听器
emitter.removeAllListeners('test');

// 移除所有监听器
emitter.removeAllListeners();

移除监听器需要传入相同的函数引用,匿名函数无法移除。

前置监听器

JavaScript
emitter.on('order', () => console.log('第二执行'));
emitter.prependListener('order', () => console.log('第一执行'));

emitter.emit('order');
// 输出: 第一执行 -> 第二执行

自定义类继承 EventEmitter

JavaScript
const EventEmitter = require('events');

class User extends EventEmitter {
  constructor(name) {
    super();
    this.name = name;
  }

  login() {
    this.emit('login', this.name);
  }

  logout() {
    this.emit('logout', this.name);
  }
}

const user = new User('Tom');

user.on('login', (name) => {
  console.log(`${name} 登录成功`);
});

user.on('logout', (name) => {
  console.log(`${name} 已退出`);
});

user.login();
user.logout();

error 事件

JavaScript
// 必须监听 error 事件,否则进程会崩溃
emitter.on('error', (err) => {
  console.error('捕获错误:', err.message);
});

emitter.emit('error', new Error('发生错误'));

// 未监听 error 时触发会导致异常退出

如果没有 error 监听器,触发 error 事件会使 Node.js 进程崩溃。

监听器数量限制

JavaScript
// 默认单个事件最多 10 个监听器
emitter.on('data', () => {});
emitter.on('data', () => {});
// ... 超过 10 个会警告

// 设置最大数量
emitter.setMaxListeners(20);

// 获取最大数量
console.log(emitter.getMaxListeners());

获取监听器信息

JavaScript
emitter.on('data', handler1);
emitter.on('data', handler2);

// 监听器数量
console.log(emitter.listenerCount('data')); // 2

// 监听器列表
console.log(emitter.listeners('data')); // [handler1, handler2]

// 所有事件名
console.log(emitter.eventNames()); // ['data']

要点总结

  • EventEmitter 是 Node.js 事件驱动的基础类
  • on 注册监听器,once 注册一次性监听器
  • emit 触发事件,removeListener 移除监听器
  • 自定义类继承 EventEmitter 可拥有事件能力
  • 必须监听 error 事件避免进程崩溃

📝 发现内容有误?点击此处直接编辑

← 上一篇 Node.js 错误处理
下一篇 → Node.js fs 文件系统模块
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库