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

发布于:2025-05-14 ⋅ 阅读:(17) ⋅ 点赞:(0)

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); // 输出: .html

const dir = path.dirname('/users/myuser/docs/file.txt');
console.log("文件所在目录:", dir); // 输出: /users/myuser/docs

const 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 模块,用于解析 URL

const 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); // 解析请求的 URL

  res.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 string

console.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 模块,给定一个文件路径字符串,输出该文件的目录名、文件名和扩展名。

网站公告

今日签到

点亮在社区的每一天
去签到