【Koa】初识 Koa

1. Koa 特点

1.1 更好的处理异步

Koa 的核心设计是基于 async/await 异步编程模型。这使得 Koa 可以更好地处理异步操作,相比于传统的回调方式,代码更清晰且更易于维护。

1.2 无内置中间件

与 Express 不同,Koa 并没有内置任何中间件,如路由、模板引擎等。Koa 提供了一个极简的核心,可以根据自己的需求添加中间件(插件)。

1.3 洋葱模型中间件

Koa 中的中间件采用了“洋葱模型”,这意味着请求通过一系列中间件层的方式处理,每个中间件都可以在请求向下传递之前做一些事情,并且在响应返回时再做处理。这种结构非常适合处理日志记录、权限验证、错误处理等情况。

并且由于洋葱模型和异步的优化,解决了 express 潜在的异步问题。

const Koa = require('koa');
const app = new Koa();// Logger 中间件
app.use(async (ctx, next) => {console.log(`${ctx.method} ${ctx.url}`);await next(); // 传递到下一个中间件
});// 响应中间件
app.use(async ctx => {ctx.body = 'Hello Koa';
});app.listen(3000);
console.log('Server running on http://localhost:3000');

express 潜在的回调问题:

在这里插入图片描述

而如果使用 koa,则会正常输出 1,2,3,4 ,主要原因是对于 async await 的支持。

可以看到,对于每个中间件,在完成了一些事情后,可以非常优雅的将控制权传递给下一个中间件,并能够等待它完成,当后续的中间件完成处理后,控制权又回到了自己,这种中间件模型称之为洋葱模型。

在这里插入图片描述

2. 核心概念

2.1 Context (ctx)

Koa 中的每个 HTTP 请求都会生成一个 Context 对象,简称 ctxctx 对象整合了 requestresponse(为原生 req, res 的二次封装),开发者可以通过 ctx 来读取请求信息和设置响应数据。

  • ctx.request: 处理请求的详细信息,如请求头、请求体、查询参数等。
  • ctx.response: 处理响应的详细信息,如状态码、响应头、响应体等。
app.use(async ctx => {ctx.body = 'This is the response body'; // 设置响应内容ctx.status = 200; // 设置响应状态码
});

为了方便使用,Koa将request和response中的很多成员提取到了context中,并使用访问器控制。

2.2 中间件

Koa 的中间件是一个 async 函数,可以使用 await next() 来控制请求传递给下一个中间件。由于采用了 async/await,错误处理可以使用标准的 try/catch 结构。

app.use(async (ctx, next) => {try {await next(); // 调用下一个中间件} catch (err) {ctx.status = err.status || 500;ctx.body = 'Internal Server Error';console.error('Error occurred:', err);}
});
2.3 错误处理

Koa 提供了内置的错误处理机制,可以在中间件中捕获错误。由于 Koa 主要基于 async/await,你可以轻松地用 try/catch 捕获异步代码中的异常。

app.use(async (ctx, next) => {try {await next();} catch (err) {ctx.status = err.status || 500;ctx.body = 'Something went wrong';}
});

koa 内部也提供了错误的注册:

// 注册
app.on("error", function(e) { console.log(e) } )
// 使用
app.use(function(ctx, next) {// ...ctx.throw(403, "you have no permission");next();
})
2.3 API

见文档,都写的非常清楚。Koa API

2.4 cookie

在这里插入图片描述

2.5 自定义空间

有时,某些中间件希望添加一些额外的信息,以方便后续中间件处理,比如当前登录的用户信息。

Koa建议把这些信息添加到ctx.state中该属性默认是一个空对象,专门提供给中间件开发者添加额外信息的。

3. 常见中间件

虽然 Koa 本身没有内置路由或其他功能,但有很多第三方中间件可用:

3.1 路由 (koa-router)

Koa 官方推荐使用 koa-router 来处理路由。

const Koa = require('koa');
const Router = require('@koa/router');
const app = new Koa();
const router = new Router();router.get('/', ctx => {ctx.body = 'Hello World!';
});app.use(router.routes());
app.listen(3000);
3.2 静态文件服务 (koa-static)

可以使用 koa-static 来提供静态文件服务,比如 CSS、JS 文件等。

const serve = require('koa-static');
app.use(serve('./public'));
3.3 请求体解析 (koa-bodyparser)

要处理 POST 请求中的表单或 JSON 数据,可以使用 koa-bodyparser

const bodyParser = require('koa-bodyparser');
app.use(bodyParser());app.use(async ctx => {console.log(ctx.request.body); // 获取 POST 请求的 body 数据ctx.body = 'Data received';
});

在这里插入图片描述

4. Koa 与 Express 的对比

  • 中间件处理: Koa 中间件基于 async/await,Express 依赖回调。
  • 灵活性: Koa 没有内置的路由或静态文件服务,需要通过第三方库添加;Express 则自带这些功能。
  • 上下文对象: Koa 使用 ctx 对象统一处理请求和响应,而 Express 分别使用原生的 reqres

express:

在这里插入图片描述

koa:

在这里插入图片描述

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

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

相关文章

深入探讨在线教育系统源码:搭建知识付费平台实战方案详解

知识付费平台是软件开发行业内炙手可热的项目,其受众群体非常广,也是很多小伙伴提问比较多的,今天小编将从在线教育系统源码开始,为大家讲解一个知识付费平台的搭建开发实战方案。 一、系统架构设计 搭建在线教育系统需考虑以下几…

2025 年 IT 前景:机遇与挑战并存,人工智能和云计算成重点

云计算de小白 投资人工智能:平衡潜力与实用性 到 2025 年,人工智能将成为 IT 支出的重要驱动力,尤其是在生成式人工智能领域。人工智能的前景在于它有可能彻底改变业务流程、增强决策能力并开辟新的收入来源。然而,现实情况更加微…

数据集-目标检测系列-兔子检测数据集 rabbit >> DataBall

数据集-目标检测系列-兔子检测数据集 rabbit >> DataBall 数据集-目标检测系列-兔子检测数据集 rabbit 数据量:8k 想要进一步了解,请联系。 DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加…

基于PI控制器的车辆行驶控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 步骤一: 确定目标与测量 4.2 步骤二: 计算误差 4.3 步骤三: 设计PI控制器 4.4 步骤四: 应用控制信号 4.5 步骤五: 反馈循环 5.完整工程文件 1.课题概述 基于PI控制器的车辆行驶控制系统是一种常…

OpenCV视频I/O(14)创建和写入视频文件的类:VideoWriter介绍

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 视频写入器类。 该类提供了用于写入视频文件或图像序列的 C API。 cv::VideoWriter 类是 OpenCV 库中用于创建和写入视频文件的一个类。它提供了…

中国国画-孙溟㠭浅析碑帖《龙藏寺碑》

中国国画——孙溟㠭浅析碑帖《龙藏寺碑》 《龙藏寺碑》 《龙藏寺碑》 全称是《恒州刺史鄂国公为国劝造龙藏寺碑》,属楷书体。碑通高3.15米,宽0.90米,厚0.29米。碑文楷书30行,行50字,1500余字,碑为龟趺。…

C语言—顺序表(含通讯录项目)

目录 一、顺序表的概念及结构 二、顺序表的分类 (2.1)静态顺序表 (2.2)动态顺序表 三、动态顺序表的实现 (3.1)基本结构定义 (3.2)初始化和销毁 (3.2.1&#xff0…

vue中使用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)

实现:使用Excel.js库创建excel文件,然后再使用 file-saver库将 Excel 文件保存到用户的本地计算机。 1.安装,可以使用npm,yarn npm install exceljs npm install file-saver 2.封装生成excel的方法 // 封装exceljs const ExcelJ…

H5 随机身份证号码、社会统一信用代码、手机号、名字、银行卡号码

平时注册可能会用到这些,原本用自己服务器搭了个,感觉纯前端的还能引入到项目中挺好的,之后再追加一些常用的随机数据,这样写表单应该就会好测试了(●’◡’●)。 在线链接 https://linyisonger.github.io/H5.Examples/?name./07…

Brave编译指南2024 MacOS篇-初始化构建环境(五)

引言 在上一篇文章中,我们完成了Brave浏览器编译所需的环境配置。现在,我们将进入下一个关键阶段:初始化构建环境。这个步骤将确保我们有一个完整的、准备就绪的开发环境,包括所有必要的依赖项和Chromium源代码。 1. 切换工作目…

上海沪鑫餐饮供应链:嘉定蔬菜配送分拣工作的精细艺术

在餐饮行业的背后,有一条默默运作的关键链条——餐饮供应链。而在上海沪鑫餐饮管理有限公司(简称沪鑫餐饮供应链、沪鑫食材)中,嘉定蔬菜配送分拣工作犹如一场精心编排的舞蹈,每一个动作都决定着最终呈现在餐桌上的美食…

文件和目录

文件和目录 获取文件属性 通过 ls 命令可以查看到文件的很多属性内容&#xff0c;这些文件属性的内容可以通过以下几个函数获取: #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>int stat(const char *pathname, struct stat *statbuf…

ISA Server配置https踩坑全过程

首先普通的http配置请参考 【ISA Server 2006发布Web网站】 https://www.bilibili.com/video/BV1qc411v75w/?share_sourcecopy_web&vd_sourcef35b2f2d0d34140bcba81b8b6f8c1b69 本文只一笔带过&#xff0c;讲一下https部分。 正解 由于我维护的是windows server 2003的…

计算机毕业设计 招生宣传管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

C语言扫盲

文章目录 C版本C语言特征GCCprintf数据类型函数指针内存管理void指针 Struct结构和Union结构typedef预处理器make工具cmake工具Projectintegral of sinc functionemulator embedded systeman event schedule 补充在线Linux终端安装Linux参考 建议还是国外教材学习…人家的PPT比…

物联网系统中OLED屏主流驱动方案详解

01 物联网系统中为什么要使用OLED驱动芯片 卓越的显示效果 1、高对比度和鲜艳色彩&#xff1a;OLED屏幕能够自发光&#xff0c;因此能够实现极高的对比度和鲜艳的色彩表现&#xff0c;这在物联网设备的显示界面上尤为重要&#xff0c;可以为用户提供更清晰、更生动的视觉体验…

[论文精读]TorWard: Discovery, Blocking, and Traceback of Malicious Traffic Over Tor

期刊名称&#xff1a;IEEE Transactions on Information Forensics and Security 发布链接&#xff1a;TorWard: Discovery, Blocking, and Traceback of Malicious Traffic Over Tor | IEEE Journals & Magazine | IEEE Xplore 中文译名&#xff1a;TorWard&#xff1a;…

jvm专题 之 内存模型

文章目录 前言一个java对象的运行过程jvm内存分布程序的基本运行程序对象什么是对象对象的创建一、类加载检查二、对象内存分配三、初始化零值四、设置对象头五、执行初始化方法 对象的访问定位 对象与类的关系由类创建对象的顺序 对象的创建 前言 一个程序需要运行&#xff0…

JNI实现Java调用C++函数

1. 测试环境 操作系统&#xff1a;win10JDK版本&#xff1a;JDK11 安装教程gcc版本&#xff1a;8.1.0 2. 声明native方法 // HelloJNI.java public class HelloJNI {// 输出Hello JNI from CPP. private native static void sayHello();// 实现两个整数相加private native s…

Android手机投屏方案实现方式对比

文章目录 1.概述2.术语解释2.1 miracast2.2 scrcpy2.4 Wifi Direct2.5 app_process 3.技术实现对比3.1 Miracast3.1.1 Miracast介绍3.1.2 Miracast原理3.1.3 Miracast优缺点分析 3.2 Scrcpy3.2.1 scrcpy 介绍3.2.2 scrcpy的实现原理3.2.3 scrcpy的优缺点分析 3.3 Google cast3.…