超级实用!详解Node.js中的path模块和events模块

简介: 超级实用!详解Node.js中的path模块和events模块

3. path 模块

用于处理文件路径,包括解析、拼接、规范化路径等操作。

const path = require('path');

path 模块是 Node.js 中的核心模块之一,用于处理文件路径和目录路径。通过 path 模块,我们可以方便地操作和转换不同平台上的文件路径。

路径操作方法

以下是 path 模块中常用的路径操作方法:

  • path.join([...paths]):将多个路径片段连接起来,并返回新的路径字符串。例如:path.join('/foo', 'bar', 'baz/asdf', 'quux', '..') 输出为 /foo/bar/baz/asdf
  • path.resolve([...paths]):将一个或多个路径解析为绝对路径,并返回新的路径字符串。相当于执行多次 cd 命令后再执行 pwd 命令得到的路径。例如:path.resolve('/foo/bar', './baz') 输出为 /foo/bar/baz
  • path.dirname(path):返回路径的目录名。例如:path.dirname('/foo/bar/baz/asdf/quux.txt') 输出为 /foo/bar/baz/asdf
  • path.basename(path[, ext]):返回路径的文件名。如果指定了第二个参数 ext,则移除文件名的扩展名。例如:path.basename('/foo/bar/baz/asdf/quux.txt') 输出为 quux.txt
  • path.extname(path):返回路径的扩展名。例如:path.extname('index.html') 输出为 .html

路径格式化方法

以下是 path 模块中常用的路径格式化方法:

  • path.normalize(path):规范化路径,解析 ... 等符号,并返回新的路径字符串。例如:path.normalize('/foo/bar//baz/asdf/quux/..') 输出为 /foo/bar/baz/asdf
  • path.isAbsolute(path):判断路径是否为绝对路径,返回布尔值。例如:path.isAbsolute('/foo/bar') 输出为 true
  • path.relative(from, to):根据当前工作目录,将路径 from 转换为相对于路径 to 的相对路径,并返回新的路径字符串。例如:path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb') 输出为 ../../impl/bbb

路径拆分方法

以下是 path 模块中常用的路径拆分方法:

  • path.parse(path):由文件路径返回一个对象,包含路径的各个组成部分,如 dir(路径)、base(文件名+扩展名)、name(文件名)和 ext(扩展名)。例如:path.parse('/foo/bar/baz/asdf/quux.txt') 返回 { root: '/', dir: '/foo/bar/baz/asdf', base: 'quux.txt', ext: '.txt', name: 'quux' }
  • path.format(pathObject):根据一个路径对象返回路径字符串。例如:path.format({ dir: '/foo/bar/baz/asdf', base: 'quux.txt' }) 输出为 /foo/bar/baz/asdf/quux.txt

总结:path 模块是 Node.js 中用于处理文件路径和目录路径的核心模块。通过 path 模块,我们可以进行路径的拼接、解析、格式化等操作。在跨平台开发时,使用 path 模块可以确保路径的正确性和一致性。

4. events 模块

提供了事件触发器和事件监听器的功能,可用于实现事件驱动的编程模式。

const EventEmitter = require('events');

events 模块是 Node.js 中的核心模块之一,用于实现事件驱动的编程。通过 events 模块,我们可以创建、触发和处理事件,从而实现模块间的解耦和异步编程

EventEmitter 类

events 模块提供了 EventEmitter 类,它是一个基于观察者模式的事件处理器。通过继承 EventEmitter 类,我们可以创建自定义的事件对象,并在对象中注册处理事件的回调函数。

创建事件对象

可以通过以下方式创建事件对象:

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();

在上述代码中,我们首先引入 events 模块并获取 EventEmitter 类。然后,我们定义了一个自定义类 MyEmitter,该类继承自 EventEmitter。最后,我们创建了一个 myEmitter 对象,该对象就是我们自定义的事件对象。

注册事件处理函数

可以使用 on 方法为事件注册处理函数,如下所示:

myEmitter.on('event', () => {
  console.log('Event occurred');
});

在上述代码中,我们使用 on 方法为 event 事件注册了一个处理函数。当事件被触发时,该处理函数将会被执行。

触发事件

可以使用 emit 方法触发事件,并传递参数给事件处理函数,如下所示:

myEmitter.emit('event');

在上述代码中,我们使用 emit 方法触发了 event 事件。当事件被触发时,与之相关联的处理函数将会被执行。如果有参数需要传递给事件处理函数,可以在 emit 方法中指定。

一次性事件处理函数

除了 on 方法外,events 模块还提供了 once 方法,用于注册一次性的事件处理函数。例如:

myEmitter.once('event', () => {
  console.log('Event occurred only once');
});

在上述代码中,我们使用 once 方法为 event 事件注册了一个一次性的处理函数。该处理函数只会被触发一次,之后就会自动解绑。

异步事件处理函数

当事件处理函数需要进行异步操作时,可以利用回调函数或 Promises 实现异步处理。例如:

myEmitter.on('event', (arg, callback) => {
  setTimeout(() => {
    console.log(arg);
    callback();
  }, 1000);
});
myEmitter.emit('event', 'Hello, World!', () => {
  console.log('Event handling completed');
});

在上述代码中,我们的事件处理函数通过使用 setTimeout 函数模拟了一个异步操作。在异步操作完成后,调用了回调函数 callback。在触发事件时,我们还可以传递额外的参数给事件处理函数。

移除事件处理函数

可以使用 offremoveListener 方法移除事件处理函数。例如:

const callback = () => {
  console.log('Event occurred');
};
myEmitter.on('event', callback);
myEmitter.off('event', callback);

在上述代码中,我们使用 on 方法注册了一个事件处理函数,然后使用 off 方法将其移除。removeListener 方法与 off 方法作用相同,可以选择使用其中之一。

继承 EventEmitter 类

除了直接使用 EventEmitter 类创建事件对象外,还可以通过继承该类来创建自定义的事件对象。这种方式允许我们在自定义事件对象中添加额外的属性和方法。

const EventEmitter = require('events');
class MyCustomEmitter extends EventEmitter {
  constructor() {
    super();
    this.customProperty = 'Hello, World!';
  }
  customMethod() {
    console.log('Custom method invoked');
  }
}
const myCustomEmitter = new MyCustomEmitter();
myCustomEmitter.on('event', () => {
  console.log(myCustomEmitter.customProperty);
  myCustomEmitter.customMethod();
});
myCustomEmitter.emit('event');

在上述代码中,我们定义了一个自定义事件对象 MyCustomEmitter,并通过继承 EventEmitter 类来实现。在构造函数中,我们初始化了一个自定义属性 customProperty 和一个自定义方法 customMethod。然后,我们创建了一个 myCustomEmitter 对象,注册了一个事件处理函数,并触发了 event 事件。在事件处理函数中,我们可以访问自定义属性和调用自定义方法。

总结:events 模块是 Node.js 中用于实现事件驱动编程的核心模块。通过 EventEmitter 类,我们可以创建事件对象,并在对象中注册处理事件的回调函数。使用 on 方法注册事件处理函数,使用 emit 方法触发事件。此外,还可以使用 once 方法注册一次性事件处理函数,使用 offremoveListener 方法移除事件处理函数。我们还可以继承 EventEmitter 类来创建自定义的事件对象,并在其中添加自定义的属性和方法。

相关文章
|
2月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
27 0
|
3天前
|
域名解析 网络协议 JavaScript
【Node系列】node工具模块
Node.js有多个内置的工具模块,这些模块提供了用于执行各种任务的功能。
17 2
|
1月前
|
JavaScript 前端开发
Node.js之path路径模块
Node.js之path路径模块
|
1月前
|
JavaScript
Node.js之http模块
Node.js之http模块
|
2月前
|
资源调度 JavaScript 关系型数据库
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
33 0
|
3月前
|
Web App开发 JavaScript 前端开发
了解 Node.js 的运行机制:从事件循环到模块系统(下)
了解 Node.js 的运行机制:从事件循环到模块系统(下)
了解 Node.js 的运行机制:从事件循环到模块系统(下)
|
3月前
|
JavaScript 前端开发 数据挖掘
了解 Node.js 的运行机制:从事件循环到模块系统(上)
了解 Node.js 的运行机制:从事件循环到模块系统(上)
了解 Node.js 的运行机制:从事件循环到模块系统(上)
|
8月前
|
JavaScript
Node.js学习笔记----模块的加载机制
Node.js学习笔记----模块的加载机制
|
12月前
|
JSON JavaScript 前端开发
Node.js学习笔记(六) express模块
Node.js学习笔记(六) express模块
92 0
|
12月前
|
JavaScript Unix API
Node.js学习笔记(四) fs、os、path模块
Node.js学习笔记(四) fs、os、path模块
80 0