红宝书第四十六讲:Node.js基础与API设计解析


红宝书第四十六讲:Node.js基础与API设计解析

资料取自《JavaScript高级程序设计(第5版)》

查看总目录:红宝书学习大纲


一、Node.js基础概念

1. 流(Streams)的核心地位 [1](#1)[2](#2)

Node.js的文件读写和网络通信依赖流机制 ,参考浏览器的Streams API[1](#1)原理:

流类型 Node.js对应示例 功能类比浏览器API
可读流 (Readable) fs.createReadStream('file.txt') fetch()响应体作为可读流^[1](#流类型 Node.js对应示例 功能类比浏览器API 可读流 (Readable) fs.createReadStream('file.txt') fetch()响应体作为可读流1 可写流 (Writable) fs.createWriteStream('output.txt') WritableStream写入数据1 转换流 (Transform) zlib.createGzip()(压缩数据) 浏览器压缩流1)^
可写流 (Writable) fs.createWriteStream('output.txt') WritableStream写入数据^[1](#流类型 Node.js对应示例 功能类比浏览器API 可读流 (Readable) fs.createReadStream('file.txt') fetch()响应体作为可读流1 可写流 (Writable) fs.createWriteStream('output.txt') WritableStream写入数据1 转换流 (Transform) zlib.createGzip()(压缩数据) 浏览器压缩流1)^
转换流 (Transform) zlib.createGzip()(压缩数据) 浏览器压缩流^[1](#流类型 Node.js对应示例 功能类比浏览器API 可读流 (Readable) fs.createReadStream('file.txt') fetch()响应体作为可读流1 可写流 (Writable) fs.createWriteStream('output.txt') WritableStream写入数据1 转换流 (Transform) zlib.createGzip()(压缩数据) 浏览器压缩流1)^

示例:文件复制(流式处理)

javascript 复制代码
const fs = require('fs');
// 创建可读流(类比浏览器中的ReadableStream[^2])
const readStream = fs.createReadStream('source.txt');
// 创建可写流
const writeStream = fs.createWriteStream('copy.txt');

// 管道传输(数据像水流一样流动)
readStream.pipe(writeStream); 

// 监听完成事件
writeStream.on('finish', () => console.log('文件复制完成'));

二、Node.js API设计原则

1. 异步非阻塞设计(事件驱动) [2](#2)

借鉴浏览器的事件监听机制(如addEventListener[3](#3)),Node.js的EventEmitter类允许对象发布事件:

javascript 复制代码
const EventEmitter = require('events');
// 自定义API类继承事件发射器
class MyAPI extends EventEmitter {
  fetchData() {
    setTimeout(() => {
      this.emit('data', { result: '数据加载完成' }); // 触发事件
    }, 1000);
  }
}

const api = new MyAPI();
api.on('data', (data) => console.log(data)); // 订阅事件
api.fetchData();

2. 模块化设计 [2](#2)

Node.js使用require加载模块,类似浏览器的模块加载器(资料5列举的模块加载器如SystemJS):

javascript 复制代码
// 引入内置fs模块(无需安装)
const fs = require('fs'); 

// 自定义模块(保存为math.js)
exports.add = (a, b) => a + b;

// 使用模块
const math = require('./math.js');
console.log(math.add(2, 3)); // 输出5

三、RESTful API设计示例

1. 使用http模块创建基本服务器 结合资料3的异步特性

假设处理用户数据请求(虽然没有显式提到Express,但可用原生模块示范):

javascript 复制代码
const http = require('http');

// 创建服务器(类似浏览器的Web API请求处理[^5])
const server = http.createServer((req, res) => {
  if (req.url === '/api/users' && req.method === 'GET') {
    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify([{ id: 1, name: 'Alice' }])); // 返回JSON数据
  } else {
    res.statusCode = 404;
    res.end('API路径不存在');
  }
});

server.listen(3000, () => {
  console.log('服务器运行在http://localhost:3000');
});

路由拆分策略流程图


目录:总目录

上篇文章:红宝书第四十五讲:状态管理核心工具详解:RxJS & Redux & MobX的奇妙世界
下篇文章:红宝书第四十七讲:Node.js服务器框架解析:Express vs Koa 完全指南

脚注


  1. 《JavaScript高级程序设计(第5版)》描述了流的分类和工作原理,类比Node.js的流操作 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  2. 《JavaScript高级程序设计(第5版)》提及文件操作API,与Node.js的fs模块功能相关 ↩︎ ↩︎ ↩︎

  3. 《JavaScript高级程序设计(第5版)》中的DOM事件模型启发了Node.js事件驱动的API设计 ↩︎

相关推荐
程序员海军23 分钟前
AI 越来越强,为什么打工人反而越来越累、越来越内耗了?
前端·程序员·aigc
vx_Biye_Design27 分钟前
springboot游泳馆系统93765-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·spring·课程设计
晴天1635 分钟前
VSCodium 项目介绍
前端·javascript·vscode
世岩清上40 分钟前
展厅数字内容同质化严重,怎样打造专属叙事风格?
大数据·前端·javascript·人工智能·html·音视频·展厅改造
晴天1642 分钟前
前端动画体系全解析:类型、实现方案与工程选型最佳实践
前端
持敬chijing1 小时前
Web前后端开发-JavaScript 入门教程
开发语言·前端·javascript
李高钢1 小时前
Python Django 框架入门:从零搭建你的第一个 Web 应用
前端·python·django
PC2005_cloud1 小时前
Rust学习笔记:所有权、借用与生命周期——Rust的核心机制
前端·后端
leoZ2311 小时前
2026-09-10-静态扫描连错三次-用运行环境当裁判
前端·javascript·vue.js·人工智能·opencv·机器学习·数据挖掘
Maxkim1 小时前
我把一个"会自己查资料"的 AI 助手塞进了浏览器侧边栏,开源了
前端·javascript