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

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

文件系统模块 (fs):

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

  • 异步方法通常以回调函数作为最后一个参数,或者返回 Promise(使用 fs.promises)。
  • 同步方法通常以 Sync 结尾,会阻塞程序直到操作完成。
javascript 复制代码
// 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 模块提供了处理文件路径和目录路径的工具方法。这在处理不同操作系统下的路径分隔符时非常有用,它能帮助你的代码在不同环境下都能正确找到"食谱文件"。

javascript 复制代码
// 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 模块有助于理解底层工作原理。这就像理解炉灶的基本工作原理,虽然你最终可能会使用更智能的电磁炉。

javascript 复制代码
// 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。这就像前台服务员需要清楚地理解顾客在订单上写的"宫保鸡丁加辣,不要葱"中的各个部分。

javascript 复制代码
// 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 模块,给定一个文件路径字符串,输出该文件的目录名、文件名和扩展名。
相关推荐
浪裡遊3 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
whale fall4 小时前
npm install安装的node_modules是什么
前端·npm·node.js
会飞的鱼先生4 小时前
Node.js-http模块
网络协议·http·node.js
用户3521802454757 小时前
MCP极简入门:node+idea运行简单的MCP服务和MCP客户端
node.js·ai编程
觅_13 小时前
Node.js 的线程模型
node.js
小飞悟16 小时前
浏览器和服务器是怎么“认出你”的?揭秘 Cookie 认证
后端·node.js
关山月16 小时前
什么是 Node.js ABI :它为什么重要
node.js
会飞的鱼先生1 天前
Node.js-path模块
node.js
企鹅侠客1 天前
实践篇:14-构建 Node.js 应用程序镜像
docker·node.js·dockerfile
爱分享的程序员1 天前
前端面试专栏-算法篇:18. 查找算法(二分查找、哈希查找)
前端·javascript·node.js