红宝书第四十七讲:Node.js服务器框架解析:Express vs Koa 完全指南

news2025/5/22 22:53:43

红宝书第四十七讲:Node.js服务器框架解析:Express vs Koa 完全指南

资料取自《JavaScript高级程序设计(第5版)》。
查看总目录:红宝书学习大纲


一、框架定位:HTTP服务器的工具箱

共同功能
快速构建Web服务器、处理路由请求、管理文件上传等后台功能

Express(老牌快递站)

  • 使用回调函数处理请求(人工柜台)
  • 中间件顺序执行(传送带流水线)

Koa(智能物流中心)

  • 使用async/await处理异步(自动化分拣机)
  • 洋葱圈模型中间件(多层处理)

二、Express使用详解:快递分拣流水线

1. 基础示例(快递签收流程)

const express = require('express');
const app = express();

// 📦 第一站:签收检查
app.use((req, res, next) => {
  console.log('包裹消毒中...');
  next(); // → 传递到下一站
});

// 🚚 第二站:路由派送
app.get('/package', (req, res) => {
  res.send('快递已签收!');
});

app.listen(3000, () => console.log('快递站已营业'));

2. 中间件流程图


三、Koa使用解析:洋葱式精加工

1. 核心特征(6层包裹处理机)

const Koa = require('koa');
const app = new Koa();

// 中间件执行顺序:1 → 3 → 5 → 6 → 4 → 2
app.use(async (ctx, next) => { 
  console.log('1-进入外层');
  await next(); // → 进入第二层
  console.log('2-退出外层');
});

app.use(async (ctx, next) => {
  console.log('3-进入中层');
  await next(); // → 进入核心处理
  console.log('4-退出中层');
});

app.use(ctx => {
  console.log('5-核心处理');
  ctx.body = '包裹加工完成';
});

执行结果

1 → 3 → 5 → 4 → 2

2. 洋葱模型示意图


四、关键差异对比表
特性ExpressKoa
异步处理回调函数(Callback Hell风险)Async/Await(代码更清晰)
错误处理需单独中间件处理通过try/catch自动捕获
中间件机制线性流水线模型洋葱圈模型(双向处理)
体积较大(含内置中间件)轻量化(需手动选中间件包)
适用场景传统中型项目现代高并发或需精细控制的项目

五、开发建议
// Koa错误处理示范(自动捕获异常)
app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.status = 500;
    ctx.body = '服务器内部错误';
  }
});

// Express路由参数示例
app.get('/books/:id', (req, res) => {
  const bookId = req.params.id; // 获取路由参数
  res.send(`查询第${bookId}本书`);
});

小白选择指南

  • 刚接触后端开发 → 选Express(教程丰富,资料多)
  • 需要高性能异步处理 → 选Koa(更适合现代JS语法)
  • 大型企业项目 → 考虑NestJS(基于Express/Koa的超集框架)
六、浏览器事件流与后端中间件 1

Express/Koa 的中间件机制类似于浏览器事件流(冒泡/捕获):

浏览器事件流后端中间件模型类比说明
捕获阶段(父→子)请求处理的预处理阶段中间件按顺序拦截请求(如日志记录)
目标阶段(事件触发)核心路由逻辑处理app.get('/user', handler)
冒泡阶段(子→父)响应的后处理阶段中间件修改响应结果(如压缩数据)


七、DOM 结构与路由分层设计 23

Express/Koa 的路由嵌套设计类似 DOM 树的结构:

// 假设为 Express 类似的路由拆分(参考资料3的模块化原则)
const userRouter = require('./routes/user');
app.use('/api', userRouter); // 将/user路径挂载到/api下

// user.js 文件内容(模块导出)
const express = require('express');
const router = express.Router();
router.get('/profile', (req, res) => res.send('用户页面'));
module.exports = router;

类比 DOM 的层级关系 2

<api>              <!-- 基路径 -->
  <user>           <!-- 子路由 -->
    <profile/>     <!-- 具体路由 -->
  </user>
</api>

八、异步处理与事件驱动 14

Koa 的async/await异步控制对比浏览器fetch链式调用:

Koa 示例(假设语法)

// 中间件:模拟异步验证
app.use(async (ctx, next) => {
  console.log('开始验证权限...');
  await next();  // 等待下游中间件执行完成
  console.log('验证结束...');
});

// 路由处理(类似浏览器API请求[^5])
app.use(async ctx => {
  const data = await fetchDataFromDB();
  ctx.body = { data };
});

浏览器fetch对比 4

fetch('/api/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

目录:总目录
上篇文章:红宝书第四十六讲:Node.js基础与API设计解析
下篇文章:红宝书第四十八讲:实时通信双雄:Socket.IO & Meteor 的奇妙旅程

脚注



  1. 《JavaScript高级程序设计(第5版)》的事件流模型类似中间件流程 ↩︎ ↩︎

  2. 《JavaScript高级程序设计(第5版)》描述了DOM的树形结构,类似路由分层 ↩︎ ↩︎

  3. 《JavaScript高级程序设计(第5版)》强调模块化编程,参考了路由拆分的实践 ↩︎

  4. 《JavaScript高级程序设计(第5版)》中的异步API请求逻辑与Koa异步处理模式类似 ↩︎ ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式Linux设备使用Go语言快速构建Web服务,实现设备参数配置管理方案探究

本文探讨&#xff0c;利用Go语言及gin框架在嵌入式Linux设备上高效搭建Web服务器&#xff0c;以实现设备参数的网页配置。通过gin框架&#xff0c;我们可以在几分钟内创建一个功能完善的管理界面&#xff0c;方便对诸如集中器&#xff0c;集线器等没有界面的嵌入式设备的管理。…

【NLP 59、大模型应用 —— 字节对编码 bpe 算法】

目录 一、词表的构造问题 二、bpe(byte pair encoding) 压缩算法 算法步骤 示例&#xff1a; 步骤 1&#xff1a;初始化符号表和频率统计 步骤 2&#xff1a;统计相邻符号对的频率 步骤 3&#xff1a;合并最高频的符号对 步骤 4&#xff1a;重复合并直至终止条件 三、bpe在NLP中…

Python对ppt进行文本替换、插入图片、生成表格

目录 1. 安装pptx2. 文本替换和插入图片3. 生成表格 1. 安装pptx pip install python-pptx2. 文本替换和插入图片 文本通过占位符例如{{$xxx}}进行标记&#xff0c;然后进行替换&#xff1b;图片通过ppt中的图形和图片中的占位符进行标记ppt如下 具体实现 from pptx import …

AI(学习笔记第一课) 在vscode中配置continue

文章目录 AI(学习笔记第一课) 在vscode中配置continue学习内容&#xff1a;1. 使用背景2. 在vscode中配置continue2.1 vscode版本2.2 在vscode中下载continue插件2.2.1 直接进行安装2.2.2 在左下角就会有continue的按钮2.2.3 可以移动到右上角2.2.3 使用的时候需要login 2.3 配…

C++ (初始面向对象之继承,实现继承,组合,修饰权限)

初始面向对象之继承 根据面向对象的编程思路&#xff0c;我们可以把共性抽象出来封装成类&#xff0c;然后让不同的角色去继承这些类&#xff0c;从而避免大量重复代码的编写 实现继承 继承机制是面向对象程序设计中使代码可以复用的最重要的手段&#xff0c;它允许程序员在保…

每日搜索--12月

12.1 1. urlencode是一种编码方式,用于将字符串以URL编码的形式进行转换。 urlencode也称为百分号编码(Percent-encoding),是特定上下文的统一资源定位符(URL)的编码机制。它适用于统一资源标识符(URI)的编码,也用于为application/x-www-form-urlencoded MIME准备数…

一天一个java知识点----Tomcat与Servlet

认识BS架构 静态资源&#xff1a;服务器上存储的不会改变的数据&#xff0c;通常不会根据用户的请求而变化。比如&#xff1a;HTML、CSS、JS、图片、视频等(负责页面展示) 动态资源&#xff1a;服务器端根据用户请求和其他数据动态生成的&#xff0c;内容可能会在每次请求时都…

游戏报错?MFC140.dll怎么安装才能解决问题?提供多种MFC140.dll丢失修复方案

MFC140.dll 是 Microsoft Visual C 2015 运行库的重要组成部分&#xff0c;许多软件和游戏依赖它才能正常运行。如果你的电脑提示 "MFC140.dll 丢失" 或 "MFC140.dll 未找到"&#xff0c;说明系统缺少该文件&#xff0c;导致程序无法启动。本文将详细介绍 …

小白如何从0学习php

学习 PHP 可以从零开始逐步深入&#xff0c;以下是针对小白的系统学习路径和建议&#xff1a; 1. 了解 PHP 是什么 定义&#xff1a;PHP 是一种开源的服务器端脚本语言&#xff0c;主要用于 Web 开发&#xff08;如动态网页、API、后台系统&#xff09;。 用途&#xff1a;构建…

常见的 14 个 HTTP 状态码详解

文章目录 一、2xx 成功1、200 OK2、204 No Content3、206 Partial Content 二、3xx 重定向1、301 Moved Permanently2、302 Found3、303 See Other注意4、Not Modified5、307 Temporary Redirect 三、4xx 客户端错误1、400 Bad Request2、401 Unauthorized3、403 Forbidden4、4…

Linux Kernel 8

可编程中断控制器&#xff08;Programmable Interrupt Controller&#xff0c;PIC&#xff09; 支持中断&#xff08;interrupt&#xff09;的设备通常会有一个专门用于发出中断请求Interrupt ReQuest&#xff0c;IRQ的输出引脚&#xff08;IRQ pin&#xff09;。这些IRQ引脚连…

原子操作CAS(Compare-And-Swap)和锁

目录 原子操作 优缺点 锁 互斥锁&#xff08;Mutex&#xff09; 自旋锁&#xff08;Spin Lock&#xff09; 原子性 单核单CPU 多核多CPU 存储体系结构 缓存一致性 写传播&#xff08;Write Propagation&#xff09; 事务串行化&#xff08;Transaction Serialization&#…

【WPF】 在WebView2使用echart显示数据

文章目录 前言一、NuGet安装WebView2二、代码部分1.xaml中引入webview22.编写html3.在WebView2中加载html4.调用js方法为Echarts赋值 总结 前言 为了实现数据的三维效果&#xff0c;所以需要使用Echarts&#xff0c;但如何在WPF中使用Echarts呢&#xff1f; 一、NuGet安装WebV…

OpenCV 图像拼接

一、图像拼接的介绍 图像拼接是一种将多幅具有部分重叠内容的图像合并成一幅完整、无缝且具有更广阔视野或更高分辨率图像的技术。其目的是通过整合多个局部图像来获取更全面、更具信息价值的图像内容。 二、图像拼接的原理 图像拼接的核心目标是将多幅有重叠区域的图像进行准…

数学建模AI智能体(4.16大更新)

别的不说就说下面这几点&#xff0c;年初内卷到现在&#xff0c;就现阶段AI水平&#xff0c;卷出了我比较满意的作品&#xff0c;这里分享给各位同学&#xff0c;让你们少走弯路&#xff1a; 1.轻松辅导学生 2.帮助学习 3.突破知识壁垒&#xff0c;缩短与大佬的差距 4.打破…

Linux》》bash 、sh 执行脚本

通常使用shell去运行脚本&#xff0c;两种方法 》bash xxx.sh 或 bash “xxx.sh” 、sh xxx.sh 或 sh “xxx.sh” 》bash -c “cmd string” 引号不能省略 我们知道 -c 的意思是 command&#xff0c;所以 bash -c 或 sh -c 后面应该跟一个 command。

如何用“AI敏捷教练“破解Scrum项目中的“伪迭代“困局?

一、什么是“伪迭代”&#xff1f; “伪迭代”是指团队表面上采用Scrum框架&#xff0c;但实际运作仍沿用瀑布模式的现象。例如&#xff1a;迭代初期开发人员集中编码、末期测试人员突击测试&#xff0c;导致资源分配不均&#xff1b;需求拆分粗糙&#xff0c;团队无法在固定时…

使用 vxe-table 来格式化任意的金额格式,支持导出与复制单元格格式到 excel

使用 vxe-table 来格式化任意的金额格式&#xff0c;支持导出与复制单元格格式到 excel 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.com/x-extends/vxe-table gitee&#xff1a;https://gitee.com/x-extends/vxe-table 安装 npm install vx…

金币捕鱼类手游《海洋管家》源码结构与系统分层解析

在休闲互动类移动应用开发中&#xff0c;捕鱼类项目因玩法成熟、逻辑清晰而成为不少开发者接触多端架构与模块化管理的重要起点。本文以一款名为《海洋管家》的项目源码为样例&#xff0c;简要解析其整体结构与主要功能模块&#xff0c;供有类似项目需求或系统学习目的的开发者…

Go语言实现OAuth 2.0认证服务器

文章目录 1. 项目概述1.1 OAuth2 流程 2. OAuth 2.0 Storage接口解析2.1 基础方法2.2 客户端管理相关方法2.3 授权码相关方法2.4 访问令牌相关方法2.5 刷新令牌相关方法 2.6 方法调用时序2.7 关键注意点3. MySQL存储实现原理3.1 数据库设计3.2 核心实现 4. OAuth 2.0授权码流程…