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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: 超级实用!详解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 类来创建自定义的事件对象,并在其中添加自定义的属性和方法。

相关文章
|
19天前
|
存储 JavaScript 前端开发
nodejs os模块
nodejs os模块
24 0
|
5天前
|
JavaScript 数据可视化
JS如何优雅的实现模块自动滚动展示
【8月更文挑战第22天】JS如何优雅的实现模块自动滚动展示
11 1
JS如何优雅的实现模块自动滚动展示
|
6天前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
50 1
|
19天前
|
存储 缓存 JSON
Node.js有哪些模块系统
【8月更文挑战第12天】Node.js有哪些模块系统
28 3
|
19天前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
55 1
|
2天前
[译] Node 模块中的 peer dependencies 是什么?
[译] Node 模块中的 peer dependencies 是什么?
|
2月前
|
存储 JavaScript 前端开发
Node中的AsyncLocalStorage 使用问题之async_wrap 模块是如何与 libuv 交互的
Node中的AsyncLocalStorage 使用问题之async_wrap 模块是如何与 libuv 交互的
|
2月前
|
监控 JavaScript 前端开发
Node中的AsyncLocalStorage 使用问题之Node.js内部模块和外部模块的加载的问题如何解决
Node中的AsyncLocalStorage 使用问题之Node.js内部模块和外部模块的加载的问题如何解决
|
Web App开发 JavaScript Unix
|
15天前
|
缓存 JavaScript 安全
2022年最新最详细的安装Node.js以及cnpm(详细图解过程、绝对成功)
这篇文章提供了2022年最新最详细的Node.js和cnpm安装教程,包括步骤图解、全局配置路径、cnpm安装命令、nrm的安装与使用,以及如何管理npm源和测试速度。
2022年最新最详细的安装Node.js以及cnpm(详细图解过程、绝对成功)