0

0

深入了解Node.js中的Koa框架

青灯夜游

青灯夜游

发布时间:2021-06-16 10:08:39

|

3198人浏览过

|

来源于掘金社区

转载

本篇文章给大家详细介绍一下node.js中的koa框架。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

深入了解Node.js中的Koa框架

在前文已经简单的了解了 Express 框架,并且使用该框架对石头剪刀布游戏进行了改造,那么来看看 Koa 框架和 Express 框架有什么不同,然后用 Koa 框架对石头剪刀布游戏进行改造吧!【推荐学习:《nodejs 教程》】

Koa

Koa 是为了解决 Express 的一些设计缺陷而诞生的。它的中间件可以通过 async function 来编写,await next() 可以中断中间件的执行,等到后面所有中间件执行完之后再执行,通过 await next() 来实现洋葱模型。

还有一个特点是对 request 和 response 的简化处理,这两者都挂载在 ctx 上使用,返回的内容也可以通过直接赋值来使用,如:ctx.response.body = fs.createStream('really_large.xml')。

而且 Koa 把路由功能砍掉了,它是通过中间件来实现的,这是一种微内核的极简思路。

核心功能(Koa 的说明文档):

用Apache Spark进行大数据处理
用Apache Spark进行大数据处理

本文档主要讲述的是用Apache Spark进行大数据处理——第一部分:入门介绍;Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。 在这个Apache Spark文章系列的第一部分中,我们将了解到什么是Spark,它与典型的MapReduce解决方案的比较以及它如何为大数据处理提供了一套完整的工具。希望本文档会给有需要的朋友带来帮助;感

下载
  • 比 Express 更极致的 request / response 简化,如:
    • ctx.status = 200
    • ctx.body = 'hello node'
  • 使用 async function 实现的中间件。
  • 有“暂停执行”的能力。
  • 在异步的情况下也符合洋葱模型。
  • 精简内核,所有额外功能都移到中间件里实现。

Koa 改造石头剪刀布游戏

同样,game.js 游戏模块和 index.html 页面的代码没有变动,需要安装依赖包:koa 和 koa-mount(npm i koa koa-mount)

koa-mount 可以将其它应用程序作为中间件挂载,传递给 mount() 函数的路径参数暂时从 url 里剥离出来,直到堆栈释放。对于创建不管用于那个路径且功能正常的整个 app 或 中间件是很有用。它把中间件挂载到一个特定的路径上,中间件独立于这个路径动作。

index.js 代码改造:

// 加载模块
const fs = require('fs');
const koa = require('koa');
const mount = require('koa-mount');

const game = require('./game');
let playerWon = 0; // 赢的次数

const app = new koa();
// 精简内核,所有额外功能都移到中间件里实现。路由使用通过 mount 的中间件实现的
// 通过 mount() 把中间件挂载到一个特定的路径上,中间件独立于这个路径动作。 
// /favicon.ico 路径的路由
app.use(
  mount('/favicon.ico', function (ctx) {
    // 对 `request` 和 `response` 的处理简化了,这两者都挂载在 `ctx` 上使用,返回的内容也可以通过直接赋值来使用
    ctx.status = 200;
    return;
  })
)
// mount中不可以跟多个函数中间件,可以通过 new koa() 来挂载在 koa 上:
const gameKoa = new koa();
app.use(
  mount('/game', gameKoa)
)
// 分离模块
gameKoa.use(
  async function (ctx, next) {
    if (playerWon >= 3) {
      // response.status(500);
      // response.send('我不会再玩了!');
      // 使用 = 赋值,更加简化了
      ctx.status = 500;
      ctx.body = '我不会再玩了!';
      return;
    }
    // 通过next执行后续中间件
    await next();
    // 当后续中间件执行完之后,会执行到这个位置
    if (ctx.playerWon) {
      playerWon++;
    }
  }
)
// 在 koa 里可以使用 async function 和 await next() 来执行异步中间件
// 使在异步的情况下也符合洋葱模型。
gameKoa.use(
  async function (ctx, next) {
    const query = ctx.query;
    const playerAction = query.action;
    if (!playerAction) {
      ctx.status = 400;
      return;
    }
    ctx.playerAction = playerAction;
    await next();
  }
)
// 异步处理,500ms后才返回结果
gameKoa.use(
  async function (ctx, next) {
    const playerAction = ctx.playerAction;
    const result = game(playerAction);
    // 对于一定需要在请求主流程里完成的操作,一定要使用await进行等待
    // 否则koa就会在当前事件循环就把http response返回出去了
    await new Promise(resolve => {
      setTimeout(() => {
        ctx.status = 200;
        if (result == 0) {
          ctx.body = '平局'
        } else if (result == -1) {
          ctx.body = '你输了'
        } else {
          ctx.body = '你赢了'
          ctx.playerWon = true;
        }
        resolve();
      }, 500)
    })
  }
)
// 打开页面 index.html
app.use(
  mount('/', function (ctx) {
    ctx.body = fs.readFileSync(__dirname + '/index.html', 'utf-8')
    return;
  })
)
// 监听端口 3000
app.listen(3000);

Express VS Koa

  • Express 门槛更低,Koa 更强大优雅。
  • Express 封装更多东西,开发更快速,Koa 可定制型更高。

它们孰“优”孰“劣”?

  • 其实框架之间并没有优劣之分
  • 不同的框架有不同的适用场景

更多编程相关知识,请访问:编程视频!!

相关专题

更多
node.js调试
node.js调试

node.js调试可以使用console.log()输出调试信息、断点调试和第三方调试工具。详细介绍:1、console.log()输出调试信息,通过在代码中插入console.log()语句,开发人员可以在控制台输出变量的值、函数的执行结果等信息,以便观察代码的执行流程和状态;2、断点调试,可以在代码中设置断点,以便在特定位置暂停代码的执行,观察变量的值和执行流程等。

347

2023.09.19

JavaScript 全栈开发基础(Node.js + 前端)
JavaScript 全栈开发基础(Node.js + 前端)

本专题系统介绍 JavaScript 在全栈开发中的核心知识结构,涵盖 Node.js 基础、Express/Koa 接口构建、前端交互设计、模块化与包管理、数据库连接、前后端数据通信与部署流程。通过完整项目示例,帮助学习者掌握从浏览器到服务器的一体化开发能力,实现真正意义上的全栈入门。

93

2025.11.26

什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

212

2025.12.18

html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

609

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

646

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

466

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

245

2023.08.01

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 8.6万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

Node.js-前端工程化必学
Node.js-前端工程化必学

共19课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号