当前位置: 首页 > news >正文

第五部分:第二节 - Node.js 核心模块:厨房里的基本工具

Node.js 提供了许多内置的核心模块 (Core Modules),无需额外安装即可直接使用。这些模块提供了操作系统级的功能,是构建 Node.js 应用的基础,就像餐厅厨房里必备的刀具、砧板、炉灶等基本工具。

文件系统模块 (fs):

fs 模块提供了与文件系统交互的功能,比如读取文件、写入文件、创建目录等。大多数 fs 模块的方法都提供了异步 (Asynchronous) 和同步 (Synchronous) 两个版本。在 Node.js 中,通常推荐使用异步方法,以避免阻塞事件循环,保持高并发能力。

  • 异步方法通常以回调函数作为最后一个参数,或者返回 Promise(使用 fs.promises)。
  • 同步方法通常以 Sync 结尾,会阻塞程序直到操作完成。
// second.js
const fs = require('fs');
const path = require('path'); // 导入 path 模块,方便处理路径const filePath = path.join(__dirname, 'my-file.txt'); // __dirname 表示当前文件所在的目录// 创建一个用于演示的文件
fs.writeFileSync(filePath, "这是文件内容。\n第二行内容。", 'utf8'); // 同步写入文件console.log("--- 异步读取文件 ---");
// 异步读取文件
fs.readFile(filePath, 'utf8', (err, data) => {if (err) {console.error("读取文件出错:", err);return;}console.log("文件内容:", data);
});console.log("--- 同步读取文件 ---");
try {// 同步读取文件const dataSync = fs.readFileSync(filePath, 'utf8');console.log("文件内容 (同步):", dataSync);
} catch (err) {console.error("同步读取文件出错:", err);
}// 异步删除文件
// fs.unlink(filePath, (err) => {
//   if (err) console.error("删除文件出错:", err);
//   else console.log("文件已删除");
// });// 还有很多其他方法,比如 fs.readdir (读取目录内容), fs.mkdir (创建目录) 等

在这里插入图片描述

路径处理模块 (path):

path 模块提供了处理文件路径和目录路径的工具方法。这在处理不同操作系统下的路径分隔符时非常有用,它能帮助你的代码在不同环境下都能正确找到“食谱文件”。

// second.js (接着上面的代码)const fullPath = path.join('/users', 'myuser', 'docs', 'file.txt');
console.log("拼接路径:", fullPath); // 输出: /users/myuser/docs/file.txt (在 Windows 上可能是 \users\myuser\docs\file.txt)const ext = path.extname('index.html');
console.log("文件扩展名:", ext); // 输出: .htmlconst dir = path.dirname('/users/myuser/docs/file.txt');
console.log("文件所在目录:", dir); // 输出: /users/myuser/docsconst base = path.basename('/users/myuser/docs/file.txt', '.txt');
console.log("文件名 (不带扩展名):", base); // 输出: file

在这里插入图片描述

HTTP 模块 (http):

http 模块是 Node.js 创建 HTTP 服务器和客户端的基础。虽然在实际开发中我们通常会使用 Express 这样的框架来简化 HTTP 服务器的创建,但理解 http 模块有助于理解底层工作原理。这就像理解炉灶的基本工作原理,虽然你最终可能会使用更智能的电磁炉。

// http_server.js
const http = require('http');
const url = require('url'); // 导入 url 模块,用于解析 URLconst hostname = '127.0.0.1'; // 本地主机
const port = 3000;        // 端口号// 创建一个 HTTP 服务器
const server = http.createServer((req, res) => {// req 是 IncomingMessage 对象,包含请求信息 (请求头、URL、方法等)// res 是 ServerResponse 对象,用于构建响应 (设置状态码、响应头、发送响应体)const parsedUrl = url.parse(req.url || '', true); // 解析请求的 URLres.statusCode = 200; // 设置 HTTP 状态码为 200 (OK)res.setHeader('Content-Type', 'text/plain; charset=utf-8'); // 设置响应头// 根据不同的 URL 路径返回不同的内容if (parsedUrl.pathname === '/') {res.end('欢迎来到主页!'); // 发送响应体并结束响应} else if (parsedUrl.pathname === '/about') {res.end('这是一个关于页面.');} else {res.statusCode = 404; // 设置状态码为 404 (Not Found)res.end('页面未找到.');}});// 启动服务器监听端口
server.listen(port, hostname, () => {console.log(`服务器运行在 http://${hostname}:${port}/`);
});// 运行这个文件: node http_server.js
// 然后在浏览器访问 http://127.0.0.1:3000/ 和 http://127.0.0.1:3000/about

在这里插入图片描述
在这里插入图片描述

URL 模块 (url):

url 模块用于解析和格式化 URL。这就像前台服务员需要清楚地理解顾客在订单上写的“宫保鸡丁加辣,不要葱”中的各个部分。

// second.js (接着上面的代码)const address = 'http://localhost:8080/pathname?name=test&age=30#hash';// 解析 URL
const parsedUrl = url.parse(address, true); // true 表示解析 query stringconsole.log("协议:", parsedUrl.protocol);  // http:
console.log("主机名:", parsedUrl.hostname); // localhost
console.log("端口:", parsedUrl.port);    // 8080
console.log("路径名:", parsedUrl.pathname); // /pathname
console.log("查询参数:", parsedUrl.query);   // { name: 'test', age: '30' } (一个对象)
console.log("hash:", parsedUrl.hash);    // #hash// 也可以格式化 URL (从解析后的对象重新构建 URL 字符串)
const formattedUrl = url.format(parsedUrl);
console.log("格式化回 URL:", formattedUrl); // http://localhost:8080/pathname?name=test&age=30#hash

在这里插入图片描述

小结: Node.js 的核心模块提供了文件系统、路径处理、HTTP 服务等基础能力。fs 模块的异步方法是实现非阻塞 I/O 的关键。http 模块是构建 Web 服务器的基础,而 url 模块帮助我们解析请求地址。

练习:

  1. 编写一个 Node.js 脚本,使用 fs 模块创建一个名为 logs 的目录(如果不存在)。
  2. logs 目录中创建一个名为 app.log 的文件,并向其中写入一行日志信息(比如当前时间戳和一条消息)。可以使用追加写入 fs.appendFilefs.appendFileSync
  3. 修改上面的 HTTP 服务器例子,使其在接收到请求时,将请求方法、URL 和当前时间记录到 logs/app.log 文件中,然后再返回响应。
  4. 编写一个 Node.js 脚本,使用 path 模块,给定一个文件路径字符串,输出该文件的目录名、文件名和扩展名。

相关文章:

  • 显示的图标跟UI界面对应不上。
  • 无人机数据处理与特征提取技术分析!
  • Thrust库中的Gather和Scatter操作
  • 【Linux】第十六章 分析和存储日志
  • uniapp vue 沉浸式窗体如何获取并排除外部手机浏览器底部菜单栏工具栏高度
  • sqli—labs第六关——双引号报错注入
  • 小白学习java第18天(上):spring
  • 【C++】17. 多态
  • 大型企业数据治理与数据资产化:数字化转型的炼金术革命
  • 如何解决电脑蓝屏错误代码:Oxc0000098
  • 鸿蒙OSUniApp开发支持多语言的国际化组件#三方框架 #Uniapp
  • elementUI调整滚动条高度后与固定列冲突问题解决
  • 高海拔和远距离的人员识别:面部、体型和步态的融合
  • Java 源码 HashMap源码分析
  • PROE 转 STP 全攻略:软件实操、在线转换与问题解决
  • 【网工第6版】第10章 网络规划和设计②
  • D. Eating【Codeforces Round 1005 (Div. 2)】
  • 微机原理与接口技术知识点总结——8086微处理器ddddd
  • 16 - VDMA之视频转发实验
  • 字符串检索算法:KMP和Trie树
  • 京东回应外卖系统崩溃:订单暴涨所致,已恢复
  • 外交部:中方期待印巴巩固和延续停火势头,避免冲突再起
  • 航行警告:渤海海峡黄海北部执行军事任务,禁止驶入
  • 习近平会见缅甸领导人敏昂莱
  • 可量产9MWh超大容量储能系统亮相慕尼黑,宁德时代:大储技术迈入新时代
  • 河南省省长王凯在郑州调研促消费工作,走访蜜雪冰城总部