koa中间件

文章目录

  • 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 = 404ctx.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.mzph.cn/news/888310.shtml

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

相关文章

【开源】A060-基于Spring Boot的游戏交易系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…

泷羽sec:shell编程(9)不同脚本的互相调用和重定向操作

声明: 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

Pod Pending无法调度

根据您提供的Kubernetes调度警告信息,以下是可能的原因分析: Insufficient Memory: 有1个节点因为内存不足而无法调度Pod。这可能是因为该节点上已经运行的Pod消耗了大量内存,没有足够的资源来运行新的Pod。 Pod Affinity/Anti-Affinity: 有…

QT 左右 上下,拉伸 分配窗口大小

要的效果是以下: QT C 两个QWideget A B现在有放在一个窗口QWideget Test内,初始比例要2:8 ,现在我要 A B 两个窗口中间 当鼠标移到他中间时,有条线,可以左右移动来控件 A B 窗口所占的大小widgetB (有 wi…

pyqt6简单应用

from PyQt6.QtWidgets import QWidget,QPushButton,QLineEdit,QLabel,QApplication from PyQt6.QtGui import QPixmap,QIcon,QCursor from PyQt6.QtCore import Qt from PyQt6 import QtCoreimport sysclass Ui_window(QWidget):def __init__(self):super().__init__()# 设置窗…

【Spring篇】初始Spring MVC框架之Spring MVC入门程序编写

🧸安清h:个人主页 🎥个人专栏:【计算机网络】【Mybatis篇】【Spring篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯Spring MVC概述 …

祖先序列重建结合机器学习改进双键还原酶-文献精读87

Ancestral Sequence Reconstruction Meets Machine Learning: Ene Reductase Thermostabilization Yields Enzymes with Improved Reactivity Profiles 祖先序列重建结合机器学习:酶还原酶热稳定化产生具有改进反应性特征的酶 摘要 烯还原酶(EREDs&…

华为的USG6000为什么不能ping通

前言: 防火墙usg6000v的镜像 链接: https://pan.baidu.com/s/1uLRk0-hnHRTLYLx1Pnplow?pwdtymp 提取码: tymp 看了好多毒文章,感觉写作业更有意思,可以了解新的知识 内容: 首先看毒文章是这样说的,华为的防火墙是…

untiy之碰撞体编辑器

在进行游戏开发时经常会遇到复杂构造的物体,那么如何类似的物体增加碰撞体呢,通过unity自带的collider是很麻烦的,这里介绍一个插件 Easy Collider editor轻松解决这个需求 1. 打开easy collider editor编辑器 2. 选择要添加碰撞体的物体&…

【Leetcode】《双指针出击:多数和问题的“破阵之匙”,解锁高效算法密码》

前言 🌟🌟本期讲解关于双指针解决多数和问题~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不…

【docker】Windows11创建Ubuntu-desktop并使用VNC完成远程访问

【docker】Windows11创建Ubuntu-desktop并使用VNC完成远程访问 文章目录 【docker】Windows11创建Ubuntu-desktop并使用VNC完成远程访问前言创建Ubuntu容器下载镜像运行容器连接容器 搭建容器XFCE桌面环境安装ubuntu桌面 总结 前言 docker ubuntu容器在深度学习领域的使用过程…

【Vulkan入门】01-列举物理设备

目录 先叨叨git信息主要逻辑VulkanEnvEnumeratePhysicalDevices()PrintPhysicalDevices() 编译并运行程序 先叨叨 上一篇已经创建了VkInstance,本篇我们问问VkInstance,在当前平台上有多少个支持Vulkan的物理设备。 git信息 repository: https://gite…

【嵌入式系统设计】LES3~5:Cortex-M4系统架构(上)第1节 ARM处理器,M4内核处理器,M4调试跟踪接口

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

分布式推理框架 xDit

1. xDiT 简介 xDiT 是一个为大规模多 GPU 集群上的 Diffusion Transformers(DiTs)设计的可扩展推理引擎。它提供了一套高效的并行方法和 GPU 内核加速技术,以满足实时推理需求。 1.1 DiT 和 LLM DiT(Diffusion Transformers&am…

资料文件夹转移工具5.2.3 |快速转移到D盘,释放C盘空间

这是一款支持将C盘的常用文件夹转移到其他磁盘分区的工具,提供仅变目录、复制资料和转移资料三种转移方式。该工具完全免费,单文件免安装,大小仅为546KB,非常适合需要释放C盘空间的用户。 大小:546KB 下载地址&#…

学习笔记052——Spring Boot 自定义 Starter

文章目录 Spring Boot 自定义 Starter1、自定义一个要装载的项目2、创建属性读取类 ServiceProperties3、创建 Service4、创建自动配置类 AutoConfigration5、创建 spring 工程文件6、将项目打成 jar 包7、jar 打包到本地仓库8、配置application.yml Spring Boot 自定义 Starte…

uniapp 自定义导航栏增加首页按钮,仿微信小程序操作胶囊

实现效果如图 抽成组件navbar.vue&#xff0c;放入分包 <template><view class"header-nav-box":style"{height:Props.imgShow?:statusBarHeightpx,background:Props.imgShow?:Props.bgColor||#ffffff;}"><!-- 是否使用图片背景 false…

node.js基础学习-express框架-静态资源中间件express.static(十一)

前言 在 Node.js 应用中&#xff0c;静态资源是指那些不需要服务器动态处理&#xff0c;直接发送给客户端的文件。常见的静态资源包括 HTML 文件、CSS 样式表、JavaScript 脚本、图片&#xff08;如 JPEG、PNG 等&#xff09;、字体文件和音频、视频文件等。这些文件在服务器端…

下载maven 3.6.3并校验文件做md5或SHA512校验

一、下载Apache Maven 3.6.3 Apache Maven 3.6.3 官方下载链接&#xff1a; 二进制压缩包&#xff08;推荐&#xff09;: ZIP格式: https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zipTAR.GZ格式: https://archive.apache.org/dist/…

单片机知识总结(完整)

1、单片机概述 1.1. 单片机的定义与分类 定义&#xff1a; 单片机&#xff08;Microcontroller Unit&#xff0c;简称MCU&#xff09;是一种将微处理器、存储器&#xff08;包括程序存储器和数据存储器&#xff09;、输入/输出接口和其他必要的功能模块集成在单个芯片上的微型…