第五部分:第二节 - 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 模块,给定一个文件路径字符串,输出该文件的目录名、文件名和扩展名。
相关推荐
码农捻旧2 小时前
解决Mongoose “Cannot overwrite model once compiled“ 错误的完整指南
javascript·数据库·mongodb·node.js·express
赵大仁11 小时前
Deno、Bun、Node.js 性能对比与选型指南
node.js
青苔猿猿16 小时前
node版本.node版本、npm版本和pnpm版本对应
前端·npm·node.js·pnpm
Adorable老犀牛17 小时前
安装npm:npm未随Node.js一起安装
npm·node.js
程序员与背包客_CoderZ19 小时前
Node.js异步编程——Callback回调函数实现
前端·javascript·node.js·web
HWL56791 天前
Express项目解决跨域问题
前端·后端·中间件·node.js·express
爱编程的小学究1 天前
【node】如何把包发布到npm上
前端·npm·node.js
2501_915373881 天前
全栈项目实战:Vue3+Node.js开发博客系统
node.js
狂野小青年1 天前
npm 报错 gyp verb `which` failed Error: not found: python2 解决方案
前端·npm·node.js