koa中间件

news2024/12/26 7:06:32

文章目录

  • 1. koa中间件简介
  • 2. 中间件类型
    • 1. 应用级中间件
    • 2. 路由级中间件
    • 3. 错误处理中间件
    • 4. 第三方中间件
  • 3.中间件执行流程


1. koa中间件简介

在Koa中,中间件呈现为一个异步函数,该函数支持 async/await 语法,它接收两个参数: ctx 和 next 。 ctx 是对当前HTTP请求的封装,而 next 是一个函数,当被调用时,执行流程会进入下一个中间件。中间件的工作被 next() 分为前后两部分,next() 返回一个 Promise 对象。

中间件的作用十分广泛,包括但不限于身份验证、日志记录、请求处理等。它为开发人员提供了一种灵活的方式来处理请求并能够增加额外的逻辑层,而不必修改核心应用逻辑。

Koa的洋葱模型是一种独特的中间件执行机制,它以next()函数为分割点,先由外到内执行请求(Request)的逻辑,然后再由内到外执行响应(Response)的逻辑。这种模型确保了中间件的执行顺序,使得依赖其他中间件结果的中间件能够正确工作。
Koa的洋葱模型

2. 中间件类型

1. 应用级中间件

应用级中间件绑定到 Koa 应用程序对象上,并在每个请求处理周期中执行。
应用级中间件通常用于执行跨路由的共享任务,比如日志记录、错误处理、身份验证等。
应用级中间件,匹配任何路由。

var router = new Router(); // 总路由
// 如果get,post回调函数中没有next参数,这个路由被匹配到了就不会继续向下匹配
app.use(async (ctx, next)=>{
  console.log('应用级中间件')
  next()
})
router.get('/abcd', async (ctx) => {
  ctx.body = '应用级中间件!'
});

// 使用路由中间件
app
  .use(router.routes())
  .use(router.allowedMethods());

app.listen(8081, function() {
  console.log('服务启动!端口号:8081')
});

在这里插入图片描述
在这里插入图片描述

2. 路由级中间件

路由级中间件与特定路由相关联,只在特定路由匹配时执行。
路由级中间件用于在特定路由上执行特定任务,比如请求验证、权限控制等。

const Koa = require('koa');
const app = new Koa();
var Router = require('koa-router');
var router = new Router(); // 总路由

app.use(async (ctx, next)=>{
  console.log('应用级中间件')
  next()
})
router.get('/abcd', async(ctx, next)=>{
  console.log('路由级中间件')
  next()
})
router.get('/abcd', async (ctx) => {
  ctx.body = '路由级中间件!'
});

// 使用路由中间件
app
  .use(router.routes())
  .use(router.allowedMethods());

app.listen(8081, function() {
  console.log('服务启动!端口号:8081')
});

在这里插入图片描述

3. 错误处理中间件

错误处理中间件用于捕获应用程序中发生的错误,并作出相应的处理。
在 Koa 中,错误处理中间件通常是最后一个中间件,用来处理未捕获的错误并发送适当的响应给客户端。

const Koa = require('koa');
const app = new Koa();
var Router = require('koa-router');
var router = new Router(); // 总路由

app.use(async (ctx, next)=>{
  console.log('应用级中间件')
  next()
  if(ctx.status == '404') {
    ctx.status = 404
    ctx.body = '404 页面'
  } else{
    ctx.body = ctx.url
  }
})
router.get('/abcd', async (ctx) => {
  ctx.body = '路由级中间件!'
});

// 使用路由中间件
app
  .use(router.routes())
  .use(router.allowedMethods());

app.listen(8081, function() {
  console.log('服务启动!端口号:8081')
});

在这里插入图片描述

4. 第三方中间件

中间件说明
koa-router提供全面的路由功能,比如类似Express的app.get/post/put的写法,URL命名参数、路由命名、嵌套路由、支持加载多个中间件
koa-bodyparserpost提交数据中间件,解析请求体时需要加载的中间件,支持x-www-form-urlencoded, application/json等格式的请求体,不支持form-data的请求体
koa-views对进行视图模板渲染,支持ejs, nunjucks等模板引擎
koa-static静态资源中间件,用作类似Nginx的静态文件服务,在本地开发时可用于加载前端文件或后端Fake数据
koa-sessionsession验证,支持将会话信息存储在本地Cookie或Redis, MongoDB
koa-jwttoken验证,路由权限控制功能,Session Base转为用Token Base
koa-helmet网络安全,增加Strict-Transport-Security, X-Frame-Options, X-Frame-Options等HTTP头,提高应用程序的安全性
koa-compress当响应体较大时,启用类似Gzip的压缩技术减少传输内容
koa-logger输出请求日志的功能,包括请求的url、状态码、响应时间、响应体大小等信息
koa-convert基于Promise的中间件和基于Generate的中间件相互转换
koa-nunjucks-2轻量级 Nunjucks 中间件,可以用作模板引擎,为koa应用提供页面渲染功能
koa-favicon页面logo加载
koa-jsonget提交数据的中间件
koa-onerror在服务器产生错误(throw 抛出等)后自动重定义到指定路径
koa-respond在Koa上下文中添加了常用的方法
  1. koa-static
    api 文档

static(root, [opts])
root: 静态文件的根目录。
opts:

  • maxage: 缓存控制,指定浏览器缓存的最大时间(毫秒)。
  • hidden: 是否允许访问隐藏文件,默认为false。
  • index: 默认索引文件名,默认为’index.html’。
  • defer: 是否延迟发送,直至其他中间件执行完毕。
  • gzip: 自动使用GZIP压缩文件,默认启用。
  • brotli: 使用Brotli压缩,默认也启用。
  • `setHeaders**: 自定义响应头设置的函数。
  • extensions: 无扩展名请求时,尝试匹配数组中的扩展名来查找文件。
import path from 'path';
const Koa = require('koa');
const app = new Koa();
const staticKoa = require('koa-static')
const __dirname = path.resolve();
app.use(staticKoa(__dirname + '/uploads'))
// 使用koa-static中间件提供静态文件服务
// 或用 app.use(serve(path.join(__dirname, 'public')));
app.listen(8081, function() {
  console.log('服务启动!端口号:8081')
});

在这里插入图片描述
在这里插入图片描述

3.中间件执行流程

1.先应用级再路由级。
2.同级别的中间件,代码顺序会影响执行顺序。
3.不同级别代码顺序无影响,都是先执行应用级再路由级

const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
var router = new Router(); // 总路由
app.use(async (ctx, next) => {
    console.log(1);
    await next();
    console.log(2);
})
 
router.get('/abcd', async (ctx, next) => {
  console.log('abcd11');
  await next();
  console.log('abcd22');
})
 
router.get('/abcd', async (ctx) => {
    console.log('abcd');
    ctx.body = "abcd页";
})
app.use(async (ctx, next) => {
  console.log(3);
  await next();
  console.log(4);
})
app
  .use(router.routes())
  .use(router.allowedMethods());
 
app.listen(8081, function() {
  console.log('服务启动!端口号:8081')
});

在这里插入图片描述

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

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

相关文章

python学opencv|读取视频(一)灰度视频制作和保存

【1】引言 上一次课学习了用opencv读取图像,掌握了三个函数:cv.imread()、cv.imshow()、cv.imwrite() 相关链接如下: python学opencv|读取图像-CSDN博客 这次课我们继续,来学习用opencv读取视频。 【2】学习资源 首先是官网…

BioDeepAV:一个多模态基准数据集,包含超过1600个深度伪造视频,用于评估深度伪造检测器在面对未知生成器时的性能。

2024-11-29, 由罗马尼亚布加勒斯特大学创建BioDeepAV数据集,它专门设计来评估最先进的深度伪造检测器在面对未见过的深度伪造生成器时的泛化能力,这对于提高检测器的鲁棒性和适应性具有重要意义。 数据集地址:biodeep 一、研究背景&#xff1…

Apache Airflow 快速入门教程

Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反,由于它的简单性和可扩展性,它已经获得了普及。在本文中,我将尝试概述它的主要概念,并让您清楚地了解何时以及如何使用它。 Airflow应用场景 …

【OpenAI库】从0到1深入理解Python调用OpenAI库的完整教程:从入门到实际运用

文章目录 Moss前沿AI一、初识OpenAI API1.1 获取API-Key(两种方案)1.2 安装OpenAI库 二、Python调用OpenAI API的基础设置2.1 设置API密钥和Base URL2.2 参数详解 三、构建一个简单的聊天应用3.1 创建聊天请求3.2 参数详解3.3 处理响应 四、完整代码示例…

42 基于单片机的智能浇花系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采样DHT11温湿度传感器检测温湿度,通过LCD1602显示 4*4按键矩阵可以设置温度湿度阈值,温度大于阈值则开启水泵,湿度大于阈值则开启风扇…

typecho 添加主题备份及恢复功能

typecho 换主题很简单,但是确有一个比较麻烦的事情,就是主题配置在切换主题的同时也就被删除了。于是,今天我下决心要弄一个备份恢复的功能出来。网上查了很久,都没有找到适合的(不过还是有参考价值的)。最…

docker部署RustDesk自建服务器

客户端: Releases rustdesk/rustdesk GitHub 服务端: 项目官方地址:GitHub - rustdesk/rustdesk-server: RustDesk Server Program 1、拉取RustDesk库 docker pull rustdesk/rustdesk-server:latest 阿里云库: docker pu…

从零开始了解推荐系统(算法构建、召回、粗排、精排、重排、冷启动、衡量标准)

算法构建 推荐算法流程 实际上是一种信息处理逻辑,当获取了用户与内容的信息之后,按照一定的逻辑处理信息后,产生推荐结果。热度排行榜就是最简单的一种推荐方法,依赖的逻辑是当一个内容被大多数用户喜欢,那么大概率…

【第 1 章 初识 C 语言】1.8 使用 C 语言的 7 个步骤

目录 1.8 使用 C 语言的 7 个步骤 1.8.1 第 1 步:定义程序的目标 1.8.2 第 2 步:设计程序 1.8.3 第 3 步:编写代码 1.8.4 第 4 步:编译 1.8.5 第 5 步:运行程序 1.8.6 第 6 步:测试和调试程序 1.8.…

基于Matlab卡尔曼滤波的GPS/INS集成导航系统研究与实现

随着智能交通和无人驾驶技术的迅猛发展,精确可靠的导航系统已成为提升车辆定位精度与安全性的重要技术。全球定位系统(GPS)和惯性导航系统(INS)在导航应用中各具优势:GPS提供全球定位信息,而INS…

C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static

文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…

深入解析级联操作与SQL完整性约束异常的解决方法

目录 前言1. 外键约束与级联操作概述1.1 什么是外键约束1.2 级联操作的实际应用场景 2. 错误分析:SQLIntegrityConstraintViolationException2.1 错误场景描述2.2 触发错误的根本原因 3. 解决方法及优化建议3.1 数据库级别的解决方案3.2 应用层的解决方案 4. 友好提…

dns实验3:主从同步-完全区域传输

服务器192.168.234.111(主服务器),打开配置文件: 打开配置文件: 关闭防火墙,改宽松模式: 重启服务: 服务器192.168.234.112(从服务器),打开配置文…

LeetCode刷题 -- 分治快排

目录 颜色分类题目解析算法原理代码 排序数组题目解析算法原理代码 数组中第K个最大元素题目解析算法原理代码 LCR 159. 库存管理 III题目解析算法原理代码 颜色分类 题目链接 题目解析 数组分为三块 算法原理 1.如果nums[i] 0,left, i下标对应元素交换&#xff0c…

【论文笔记】Leveraging the Power of MLLMs for Gloss-Free Sign Language Translation

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Leveraging the Power of …

TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证

日前,TsingtaoAI推出的“具身智能高校实训解决方案-从AI大模型机器人到通用具身智能”基于华为技术有限公司AI框架昇思MindSpore,完成并通过昇腾相互兼容性技术认证。 TsingtaoAI&华为昇腾联合解决方案 本项目“具身智能高校实训解决方案”以实现高…

如何抓取亚马逊页面动态加载的内容:Python爬虫实践指南

引言 在现代电商领域,数据的重要性不言而喻。亚马逊作为全球领先的电商平台,其页面上动态加载的内容包含了丰富的商品信息。然而,传统的爬虫技术往往难以应对JavaScript动态加载的内容。本文将详细介绍如何使用Python结合Selenium工具来抓取…

tcpdump抓包wireshark分析

背景 分析特定协议的数据包,如 HTTP、DNS、TCP、UDP 等,诊断网络问题,例如连接故障、延迟和数据包丢失。 大概过程 1.安装tcpdump yum update yum install tcpdump2.抓包,从当前时间起,一小时后停止&#xff0c…

如何进行Appium实现移动端UI自动化测试呢?

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门,那么我们就直奔主题。文章结构如下: 为什么要使用…

骨架行为识别-论文复现

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…