全部学科
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 http HTTP 模块
下一篇 → Node.js util 工具函数模块
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码