Node.js特训专栏-基础篇:3. Node.js内置模块的使用

🔥 欢迎来到 Node.js 实战专栏!在这里,每一行代码都是解锁高性能应用的钥匙,让我们一起开启 Node.js 的奇妙开发之旅!
Node.js 特训专栏主页
在这里插入图片描述

Node.js内置模块:强大功能的基石

在Node.js的世界里,内置模块犹如一座宝藏库,为开发者提供了丰富且实用的功能。这些模块随Node.js一同安装,无需额外下载,极大地提升了开发效率。接下来,让我们深入探索一些常用内置模块的奇妙用法。

一、fs模块:文件系统的掌控者

fs模块是Node.js操作文件系统的得力助手,无论是读取文件、写入文件,还是创建目录、删除文件等操作,它都能轻松胜任。

1. 读取文件

  • 异步读取:在处理大文件或对响应速度要求较高的场景中,异步读取是首选。通过fs.readFile方法,我们可以在不阻塞主线程的情况下读取文件内容。例如:
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {if (err) {console.error('读取文件失败:', err);return;}console.log('文件内容:', data);
});

这里,example.txt是要读取的文件名,utf8指定了文件的编码格式。当读取操作完成后,回调函数会被触发,err参数表示可能出现的错误,data则是读取到的文件内容。

  • 同步读取:同步读取文件相对简单直接,但会阻塞主线程,可能影响应用的性能。适用于文件较小且对性能影响不大的情况。使用fs.readFileSync方法,示例如下:
const fs = require('fs');
try {const data = fs.readFileSync('smallFile.txt', 'utf8');console.log('文件内容:', data);
} catch (err) {console.error('读取文件失败:', err);
}

2. 写入文件

  • 异步写入fs.writeFile用于异步写入文件。如果文件不存在,会自动创建;如果文件已存在,则会覆盖原有内容。示例代码如下:
const fs = require('fs');
const content = '这是要写入文件的内容';
fs.writeFile('newFile.txt', content, 'utf8', (err) => {if (err) {console.error('写入文件失败:', err);return;}console.log('文件写入成功');
});
  • 同步写入:同步写入使用fs.writeFileSync方法,与异步写入类似,只是操作会阻塞主线程。
const fs = require('fs');
const content = '同步写入的内容';
try {fs.writeFileSync('syncFile.txt', content, 'utf8');console.log('同步写入成功');
} catch (err) {console.error('同步写入失败:', err);
}

3. 其他文件系统操作

fs模块还提供了诸如fs.unlink(删除文件)、fs.mkdir(创建目录)、fs.rmdir(删除目录)等丰富的方法,满足各种文件系统操作需求。例如,创建一个新目录:

const fs = require('fs');
fs.mkdir('newDirectory', (err) => {if (err) {console.error('创建目录失败:', err);return;}console.log('目录创建成功');
});

二、path模块:路径处理的专家

在不同操作系统中,文件路径的表示方式存在差异,而path模块可以帮助我们统一处理路径问题,避免因路径格式不一致导致的错误。

1. 路径拼接

path.join方法用于拼接路径,它会根据当前操作系统的路径分隔符,将传入的路径片段正确连接起来。示例如下:

const path = require('path');
const joinedPath = path.join('parent', 'child', 'file.txt');
console.log(joinedPath);
// 在Windows上可能输出: parent\child\file.txt
// 在Linux或macOS上可能输出: parent/child/file.txt

2. 获取路径信息

  • 获取目录名:使用path.dirname方法可以获取文件路径中的目录部分。例如:
const path = require('path');
const filePath = '/user/home/docs/file.txt';
const dirName = path.dirname(filePath);
console.log(dirName); // 输出: /user/home/docs
  • 获取文件名path.basename方法用于获取路径中的文件名。如果只想获取文件名而不包含扩展名,可以传入第二个参数true。示例:
const path = require('path');
const filePath = '/user/home/docs/file.txt';
const baseName = path.basename(filePath);
const baseNameWithoutExt = path.basename(filePath, '.txt');
console.log(baseName); // 输出: file.txt
console.log(baseNameWithoutExt); // 输出: file
  • 获取文件扩展名path.extname方法能够获取文件的扩展名。
const path = require('path');
const filePath = '/user/home/docs/file.txt';
const ext = path.extname(filePath);
console.log(ext); // 输出:.txt

三、http模块:Web服务的构建者

http模块使我们能够轻松创建HTTP服务器和客户端,是构建Web应用的核心模块之一。

1. 创建HTTP服务器

下面是一个简单的HTTP服务器示例,它监听3000端口,当接收到请求时,返回“Hello, World!”:

const http = require('http');
const server = http.createServer((req, res) => {res.statusCode = 200;res.setHeader('Content-Type', 'text/plain');res.end('Hello, World!');
});
server.listen(3000, () => {console.log('服务器正在监听3000端口');
});

在这个例子中,http.createServer方法接收一个回调函数,该函数在每次接收到HTTP请求时被调用。req对象包含了请求的信息,res对象用于处理响应。

2. 发起HTTP请求

http模块也可以用于发起HTTP请求。以下是一个简单的GET请求示例:

const http = require('http');
const options = {hostname: 'www.example.com',port: 80,path: '/',method: 'GET'
};
const req = http.request(options, (res) => {let data = '';res.on('data', (chunk) => {data += chunk;});res.on('end', () => {console.log('响应内容:', data);});
});
req.end();

这里通过http.request方法创建了一个HTTP请求,设置了请求的目标主机、端口、路径和方法等选项。通过监听res对象的dataend事件,可以获取完整的响应内容。

四、events模块:事件驱动的核心

events模块是Node.js事件驱动架构的基础。在Node.js中,许多对象都是EventEmitter类的实例,它们能够触发和监听事件。例如,http服务器实例就继承自EventEmitter,可以监听request事件来处理客户端请求。

事件监听与触发

使用on方法来监听事件,emit方法来触发事件。以下是一个简单示例:

const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('customEvent', (arg1, arg2) => {console.log('自定义事件触发,参数1:', arg1, '参数2:', arg2);
});
emitter.emit('customEvent', 'value1', 'value2');

在这个例子中,我们创建了一个EventEmitter实例emitter,通过on方法监听customEvent事件,并在事件触发时执行回调函数。然后使用emit方法触发了该事件,并传递了两个参数。这在处理异步操作完成通知、状态变化通知等场景中非常有用。

五、util模块:实用工具集

util模块提供了一系列实用工具函数,帮助开发者简化常见的编程任务。

promisify函数

util.promisify用于将基于回调函数的API转换为返回Promise的版本,这在处理异步操作时极大地提高了代码的可读性和可维护性。例如,将fs.readFile转换为Promise风格:

const util = require('util');
const fs = require('fs');
const readFile = util.promisify(fs.readFile);
readFile('example.txt', 'utf8').then(data => {console.log('文件内容:', data);}).catch(err => {console.error('读取文件失败:', err);});

inspect函数

util.inspect函数用于生成对象的字符串表示形式,方便调试和查看对象结构。它提供了更多格式化选项,比直接使用console.log打印对象更具可读性。例如:

const util = require('util');
const complexObj = {a: 1,b: 'string',c: [1, 2, { nested: 'value' }]
};
console.log(util.inspect(complexObj, { depth: null }));

这里depth: null参数表示打印对象的完整深度,不会截断嵌套对象的显示。

六、querystring模块:查询字符串处理

querystring模块专门用于处理URL查询字符串的解析与格式化。在处理HTTP请求中的查询参数时,这个模块非常实用。

解析查询字符串

使用querystring.parse方法将查询字符串转换为对象。例如:

const querystring = require('querystring');
const query = 'name=John&age=30&city=New%20York';
const parsedQuery = querystring.parse(query);
console.log(parsedQuery);
// 输出: { name: 'John', age: '30', city: 'New York' }

构建查询字符串

使用querystring.stringify方法将对象转换为查询字符串。例如:

const querystring = require('querystring');
const user = {name: 'John',age: 30,city: 'New York'
};
const stringifiedQuery = querystring.stringify(user);
console.log(stringifiedQuery);
// 输出: name=John&age=30&city=New%20York

七、os模块:操作系统信息获取

os模块提供了与操作系统相关的信息和功能。通过它,我们可以轻松获取系统的各种信息,如CPU核心数、内存使用情况、操作系统类型等。

获取系统信息示例

const os = require('os');
console.log('操作系统类型:', os.type());
console.log('CPU核心数:', os.cpus().length);
console.log('总内存:', os.totalmem());
console.log('空闲内存:', os.freemem());
console.log('主机名:', os.hostname());

这些信息在进行系统性能监控、资源分配优化等场景中十分关键,帮助开发者根据系统实际情况做出更合理的决策。

八、stream模块:高效数据处理

stream模块为Node.js的I/O操作提供了流处理能力,使得处理大文件或大量数据时能够高效地逐块读取和写入,避免一次性将所有数据加载到内存中。

可读流与可写流示例

以下是一个简单的文件复制示例,使用可读流读取文件,通过可写流写入新文件:

const fs = require('fs');
const readStream = fs.createReadStream('source.txt');
const writeStream = fs.createWriteStream('destination.txt');
readStream.pipe(writeStream);
readStream.on('error', (err) => {console.error('读取文件错误:', err);
});
writeStream.on('error', (err) => {console.error('写入文件错误:', err);
});
writeStream.on('finish', () => {console.log('文件复制完成');
});

pipe方法将可读流和可写流连接起来,实现数据的自动流动和处理,大大简化了流操作的代码。

九、process模块:掌控当前进程

process是一个全局对象,代表当前运行的Node.js进程。它提供了关于进程的信息和控制方法,如获取进程参数、设置退出码、监听进程事件等。

进程信息与事件监听示例

// 获取命令行参数
console.log('命令行参数:', process.argv);
// 监听进程退出事件
process.on('exit', (code) => {console.log('进程即将退出,退出码:', code);
});
// 监听未捕获的异常
process.on('uncaughtException', (err) => {console.error('未捕获的异常:', err.message);console.error(err.stack);
});

通过process模块,开发者可以更好地管理和监控Node.js进程的运行状态,处理异常情况,确保应用程序的稳定性。

十、timers模块:定时器功能

timers模块封装了setTimeoutsetInterval等定时器功能,用于在指定时间后执行代码或按固定间隔重复执行代码。

定时器使用示例

// 使用setTimeout在2秒后执行回调
setTimeout(() => {console.log('2秒已过');
}, 2000);
// 使用setInterval每1秒执行一次回调
const intervalId = setInterval(() => {console.log('1秒过去了');
}, 1000);
// 5秒后清除定时器
setTimeout(() => {clearInterval(intervalId);console.log('定时器已清除');
}, 5000);

在实现轮询任务、延迟执行操作等场景中,timers模块的定时器功能发挥着重要作用。

十一、url模块:URL解析与处理

url模块用于解析和格式化URL。在处理HTTP请求、构建网络请求等涉及URL操作的场景中,它是不可或缺的工具。

URL解析示例

const url = require('url');
const myUrl = url.parse('https://user:pass@www.example.com:8080/path/to/myfile.html?query=string#hash');
console.log('协议:', myUrl.protocol);
console.log('用户名:', myUrl.auth.split(':')[0]);
console.log('密码:', myUrl.auth.split(':')[1]);
console.log('主机名:', myUrl.hostname);
console.log('端口:', myUrl.port);
console.log('路径名:', myUrl.pathname);
console.log('查询字符串:', myUrl.query);
console.log('哈希值:', myUrl.hash);

在Node.js v10及更高版本中,官方还推荐使用全局的URL构造函数来处理和解析URL,它提供了更丰富的功能和更便捷的操作方式。例如:

const { URL } = require('url');
const myUrlString = 'https://user:pass@www.example.com:8080/path/to/myfile.html?query=string#hash';
const myUrl = new URL(myUrlString);
console.log('协议:', myUrl.protocol);
console.log('用户名:', myUrl.username);
console.log('密码:', myUrl.password);
console.log('主机名:', myUrl.hostname);
console.log('端口:', myUrl.port);
console.log('路径名:', myUrl.pathname);
console.log('查询字符串:', myUrl.search);
console.log('哈希值:', myUrl.hash);
// 获取查询参数对象
console.log('解析后的查询参数:', myUrl.searchParams);
// 也可以直接通过searchParams获取或设置查询参数
console.log('查询参数"query"的值:', myUrl.searchParams.get('query'));
myUrl.searchParams.set('newParam', 'newValue');
console.log('更新后的URL:', myUrl.href);

Node.js的内置模块远不止上述这些,若想探索更多内置模块及其详细用法,可访问Node.js官方文档:Node.js官方文档 - 内置模块 。熟练掌握这些内置模块的使用,能够让我们在开发过程中事半功倍,打造出更加高效、稳定的应用程序。希望通过本文的介绍,你能对Node.js内置模块有更深入的了解和应用。

❤️❤️❤️如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、评论、关注本专栏!后续还有更多 Node.js 实战干货持续更新,别错过提升开发技能的好机会~有任何问题或想了解的内容,也欢迎在评论区留言!👍🏻 👍🏻 👍🏻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85179.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于MATLAB实现的Capon、MUSIC、ESPRIT和PM算法进行DOA

使用Capon、MUSIC、ESPRIT和PM多种算法进行doa估计,通过谱峰搜索函数估计到达角,并使用蒙特卡洛方法估计各算法的RMSE。(可能计算时间较长,如需节省时间可以减小蒙特卡洛次数) PM.m , 574 RMSE.m , 274 TLS_ESPRIT.m …

某网站极验4滑块验证码逆向分析

文章目录 1. 写在前面2. 接口分析3. w逆向分析4. JSON参数分析5. 距离识别6. RSA纯算还原7. AES纯算还原【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于…

深入理解 C++ inline:三大语法特性 + 七大高频考点全解析

一、什么是内联函数 编译器尝试将 inline 函数的代码直接插入调用处(类似宏展开),避免函数调用的压栈、跳转、返回等额外开销。适用于短小频繁调用的函数:如简单的 getter/setter、数学运算等。inline 只是 建议,编译…

Flink 与 Hive 深度集成

引言 在大数据生态中,Flink 的流批一体化处理能力与 Hive 的数据存储分析优势结合,通过 Flink Connector for Hive 实现无缝对接,能显著提升数据处理效率。本文将系统解析 Flink 与 Hive 集成的核心操作,涵盖配置、读写、优化全流…

Axios面试常见问题详解

axios面试常问题目及其详解 以下是前端面试中关于 Axios 的常见问题及详细解答,涵盖核心原理、实战场景和进阶优化,帮助你在面试中清晰展示技术深度。 1. Axios 是什么?它与原生 Fetch API 有何区别? 回答要点: Axi…

14.2 《3小时从零搭建企业级LLaMA3语言助手:GitHub配置+私有化模型集成全实战》

3小时从零搭建企业级LLaMA3语言助手:GitHub配置私有化模型集成全实战 关键词:GitHub 仓库配置, 项目初始化, 目录结构设计, 私有化模型集成, 开发环境标准化 Fork 并配置 GitHub 项目仓库 本节将手把手完成 LanguageMentor 项目的仓库克隆、环境配置和…

生物制药自动化升级:Modbus TCP与Ethernet/IP协议转换实践

为优化生物制药生产流程,我司计划将现有的Allen-Bradley PLC控制系统与新型生物反应器进行集成。由于两者采用不同的通信协议(AB PLC使用Modbus TCP,而生物反应器支持Ethernet/IP),直接通信存在障碍。为此通过稳联技术…

商业云手机核心优缺点分析

商业云手机核心优缺点分析,综合技术性能、成本效率及场景适配性等多维度对比: 核心优势‌ 成本革命‌ 硬件零投入‌:免除实体手机采购(旗舰机均价6000元),企业百台规模可省60万 CAPEX。 弹性计费‌&…

Windows 远程桌面添加 SSL 证书指南

Windows 远程桌面添加 SSL 证书指南 🧾 准备工作🔐 第一步:使用 Certbot 申请 SSL 证书📦 第二步:生成 PFX 格式证书文件📁 第三步:导入证书到 Windows 证书管理器🔒 第四步&#xf…

项目实训技术实现——核心关键:基于二叉分割的布局生成算法

核心关键:基于二叉分割的布局生成算法 上一篇针对llava这种为每个元素分别预测每个元素的框的方法进行了分析,已经证实这条路难以行得通。因此,我们考虑直接按照板块划分整个背景布局,然后在板块内,进一步划分出我们需…

uniapp 配置devserver代理

在uniapp项目中配置devserver代理,需要先检查用的vue版本。 vue3不能在manifest.json配置代理。 1.先检查项目用的vue版本 找到manifest.json文件查看vue的版本。 2.vue2在manifest.json内配置 "h5" : { "devServer": { …

移动端 WebView 页面性能调试实战:WebDebugX等工具协同与优化

随着移动互联网的发展,越来越多的应用开始使用 WebView 加载网页内容。然而,这种方式虽然能快速实现跨平台开发,但也带来了很多性能瓶颈,尤其是在移动端设备上。WebView 本身的性能限制、页面加载慢、JS 执行阻塞等问题时常成为开…

临时文件夹大量0字节xml问题排查

某天偶然打开我的c:\users\我的用户名\AppData\Local\Temp 目录,发现有很多0字节的.xml文件,你删除以后一会还会大量产生,如下图: 下载了ProcessMonitor,记录了一会日志,查找*.xml发现是资源管理器在创建这…

突破微小目标检测瓶颈:智能无人机在蓝莓产量估算中的解决方案

【导读】 本文提出了一种使用搭载计算机视觉的智能无人机估算蓝莓产量的方法。系统利用两个YOLO模型:一个检测灌木丛,另一个检测浆果。它们协同工作,智能控制无人机位置和角度,安全获取灌木近景图,实现精准的浆果计数…

API 管理系统实践指南:监控、安全、性能全覆盖

在数字化转型和云原生架构全面普及的当下,API(应用编程接口) 已成为现代技术和业务架构的核心基石。从移动应用到智能硬件,从企业后端系统到 AI 模型调用,几乎所有系统都在通过 API 实现互联互通。API 这个词听起来有点…

Leetcode-​930. 和相同的二元子数组​

Problem: 930. 和相同的二元子数组 思路 滑动窗口 解题过程 我们可以通过计算 和大于等于 goal 的子数组数目 与 和大于等于 goal1 的子数组数目 的差值&#xff0c;来得到 和恰好等于 goal 的子数组数目。 Code c class Solution { public:int at_most(vector<int>&…

『大模型笔记』第1篇:高效请求排队:优化大语言模型(LLM)性能

『大模型笔记』高效请求排队:优化大语言模型(LLM)性能 文章目录 一. 起点:基础的推理引擎二. 问题:“重度用户”会阻塞其他用户三. 解决方案:公平调度3.1. 扩展思路四. 问题:后端队列没有“反压”机制五. 解决方案:获取后端指标5.1 扩展思路六. 替代方案:后端优先级调…

Docker Docker Compose 一键安装

目录 获取安装脚本文件执行安装脚本文件文章结束⚠️ 注意事项&#xff1a;Docker V1 与 V2 的区别 一行命令装 docker 和 docker compose。 你是否厌倦了在不同的 Linux 系统上一遍又一遍地手动安装 Docker 和 Docker Compose&#xff1f;&#x1f914; 不论你是 Ubuntu 、Deb…

Java 单例模式实现方式

Java 单例模式实现方式 单例模式是确保一个类只有一个实例&#xff0c;并提供一个全局访问点的设计模式。以下是 Java 中实现单例模式的几种常见方式&#xff1a; 1. 饿汉式&#xff08;Eager Initialization&#xff09; public class EagerSingleton {// 类加载时就初始化p…

数字化零售如何全面优化顾客体验

一、引言 数字化零售是互联网、大数据、人工智能等技术在零售业中的应用&#xff0c;是现代零售业发展的必然趋势。随着线上购物、移动支付和全渠道销售的普及&#xff0c;零售行业发生了颠覆性的变化。数字化零售不仅提高了企业运营效率&#xff0c;更为顾客提供了便捷、个性化…