Node js 内置模块详解与实战(十三)

Node.js 内置模块是 Node.js 运行时自带的一系列核心功能模块,无需额外安装即可直接使用。这些模块提供了丰富的系统功能,如文件操作、网络通信、进程管理等,是 Node.js 开发的基础工具。本文将详细介绍 Node.js 的主要内置模块,并通过具体示例展示它们的实际应用。

1. fs (文件系统模块)

fs 模块提供了与文件系统交互的 API,支持同步和异步两种操作方式。它可以帮助你读写文件、创建和删除目录、监视文件变化以及获取文件信息。

主要功能

  • 读写文件:读取和写入文件内容。
  • 创建/删除目录:创建和删除文件目录。
  • 监视文件变化:监听文件的修改事件。
  • 获取文件信息:获取文件的元数据信息。

示例代码

异步读取文件

const fs = require('fs');

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

同步写入文件

try {
  fs.writeFileSync('output.txt', 'Hello Node.js');
  console.log('文件写入成功');
} catch (err) {
  console.error(err);
}

2. path (路径模块)

path 模块提供处理文件和目录路径的工具函数,可以跨平台使用。它帮助你在不同操作系统上正确地处理路径问题。

常用方法

  • path.join():连接路径片段。
  • path.resolve():解析为绝对路径。
  • path.basename():获取文件名。
  • path.extname():获取文件扩展名。

示例代码

const path = require('path');

const fullPath = path.join(__dirname, 'files', 'example.txt');
console.log(fullPath); // 输出类似: /home/user/project/files/example.txt

const ext = path.extname('index.html');
console.log(ext); // 输出: .html

3. http (HTTP 模块)

http 模块允许 Node.js 作为 HTTP 服务器或客户端运行。它提供了创建 HTTP 服务器和发起 HTTP 请求的功能。

主要功能

  • 创建 HTTP 服务器:监听指定端口,处理客户端请求。
  • 发起 HTTP 请求:向其他服务器发送请求。
  • 处理 HTTP 请求和响应:解析请求数据,生成响应内容。

示例代码:创建简单服务器

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello Node.js Server');
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

4. events (事件模块)

events 模块提供了事件驱动的编程接口,是 Node.js 异步编程的基础。它允许你定义和处理自定义事件。

核心概念

  • EventEmitter 类:事件发射器类,用于创建事件对象。
  • 事件监听 (on):注册事件监听器。
  • 事件触发 (emit):触发事件,调用所有注册的监听器。

示例代码

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// 监听事件
myEmitter.on('event', () => {
  console.log('事件被触发!');
});

// 触发事件
myEmitter.emit('event');

5. os (操作系统模块)

os 模块提供与操作系统相关的实用方法和属性。它可以帮助你获取系统的各种信息,如 CPU 信息、内存信息、网络接口信息等。

常用功能

  • 获取 CPU 信息:获取系统的 CPU 信息。
  • 获取内存信息:获取系统的总内存和可用内存。
  • 获取网络接口信息:获取网络接口的详细信息。
  • 获取系统临时目录:获取系统的临时目录路径。

示例代码

const os = require('os');

console.log(os.platform()); // 操作系统平台
console.log(os.totalmem()); // 系统总内存
console.log(os.freemem()); // 系统可用内存
console.log(os.cpus()); // CPU 信息

其他重要内置模块

1. util (实用工具模块)

util 模块提供各种实用功能,包括类型检查、格式化字符串、回调函数转 Promise、继承工具等。

2. crypto (加密模块)

crypto 模块提供加密功能,包括哈希算法、HMAC、加密/解密、数字签名等。

3. stream (流模块)

stream 模块是处理流数据的抽象接口,Node.js 中许多模块都基于流实现。

4. child_process (子进程模块)

child_process 模块允许创建和控制子进程,可以执行系统命令或其他程序。

5. url (URL 处理模块)

url 模块提供 URL 解析和格式化的工具。

如何使用内置模块

所有内置模块都可以通过 require() 函数直接加载。使用时需要注意以下几点:

  1. 模块名称不需要加路径:直接使用模块名称即可。

  2. 模块名称区分大小写:确保模块名称的大小写正确。

  3. 不需要安装:内置模块是 Node.js 自带的,无需额外安装。

  4. 不同 Node.js 版本可能包含不同的内置模块:确保使用的 Node.js 版本支持所需模块。

示例代码

const moduleName = require('module_name');

内置模块的优势

  1. 高性能:与 Node.js 运行时紧密集成,性能优越。
  2. 稳定性:经过严格测试,可靠性高。
  3. 无需安装:开箱即用,无需额外配置。
  4. 跨平台:在不同操作系统上表现一致。
  5. 文档完善:官方文档详细,易于学习和使用。

实战应用:构建一个简单的 HTTP 应用程序

在 Node.js 中构建一个简单应用通常包括以下几个步骤:

  1. 安装 Node.js
  2. 创建项目文件夹
  3. 初始化项目
  4. 创建应用入口文件
  5. 编写服务器代码
  6. 运行服务器
  7. 访问服务器
  8. 添加路由

1. 安装 Node.js

首先确保系统上已安装 Node.js 和 npm,可以在命令行中输入以下命令进行验证:

node -v
npm -v

如果还未安装,请参考 Node.js 安装配置。

2. 创建项目文件夹

在终端中,创建一个项目文件夹 my-first-node-app 并进入该文件夹:

mkdir my-first-node-app
cd my-first-node-app

3. 初始化项目

通过 npm init 命令生成 package.json 文件,它包含了项目的配置信息。

运行以下命令并按提示填写信息(可以直接按回车跳过):

npm init -y

把 package.json 文件修改为以下内容:

{
  "name": "my-first-node-app",
  "version": "1.0.0",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {}
}

4. 创建应用入口文件

在项目根目录 my-first-node-app 下创建一个 app.js 文件,这是应用的入口文件,用于设置服务器和处理请求。

5. 编写服务器代码

在 app.js 文件中编写以下代码,用于创建一个简单的 HTTP 服务器:

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.url === '/') {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Welcome to the homepage!');
  } else if (req.url === '/about') {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('This is the about page.');
  } else {
    res.writeHead(404, { 'Content-Type': 'text/plain' });
    res.end('404 Not Found');
  }
});

const PORT = 3000;

server.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});

6. 运行服务器

在项目根目录下执行以下命令,启动服务器:

npm start

你会看到控制台输出如下信息:

Server is running on http://localhost:3000

7. 访问服务器

打开浏览器并访问 http://localhost:3000,你会看到页面显示如下

Welcome to the homepage!

8. 添加路由

为了处理不同的请求路径,可以在服务器代码中添加简单的路由,例如:

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.url === '/') {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Welcome to the homepage!');
  } else if (req.url === '/about') {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('This is the about page.');
  } else {
    res.writeHead(404, { 'Content-Type': 'text/plain' });
    res.end('404 Not Found');
  }
});

const PORT = 3000;

server.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});

通过上述步骤,你已经构建了一个简单的 Node.js 应用,并且可以处理不同的请求路径。这个基础应用可以进一步扩展,如添加数据库支持、引入 Express 框架处理复杂路由等,为更复杂的项目奠定基础。

处理 GET/POST 请求

在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交。表单提交到服务器一般都使用 GET/POST 请求。

获取 GET 请求内容

由于 GET 请求直接被嵌入在路径中,URL 是完整的请求路径,包括了 ? 后面的部分,因此你可以手动解析后面的内容作为 GET 请求的参数。Node.js 中可以使用 URL 构造函数解析请求的 URL。

示例代码

const http = require('http');
const util = require('util');

http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });

  // 使用 URL 构造函数解析请求的 URL
  const myUrl = new URL(req.url, `http://${req.headers.host}`);

  // 输出 URL 的各个部分
  res.end(util.inspect({
    href: myUrl.href,
    origin: myUrl.origin,
    protocol: myUrl.protocol,
    host: myUrl.host,
    hostname: myUrl.hostname,
    port: myUrl.port,
    pathname: myUrl.pathname,
    search: myUrl.search,
    searchParams: Object.fromEntries(myUrl.searchParams) // 将 searchParams 转为普通对象
  }));
}).listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

通过上述代码,你可以解析并输出 GET 请求中的 URL 参数,从而更好地处理用户请求。

总结

本文详细介绍了 Node.js 的主要内置模块及其功能,并通过具体示例展示了它们的实际应用。这些内置模块为 Node.js 开发提供了强大的支持,帮助开发者高效地构建各种应用程序。希望本文对你理解和使用 Node.js 内置模块有所帮助。