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.rhkb.cn/news/483393.html

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

相关文章

【第 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.…

React 路由与组件通信:如何实现路由参数、查询参数、state和上下文的使用

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

SpringMVC:参数传递之日期类型参数传递

环境准备和参数传递请见:SpringMVC参数传递环境准备 日期类型比较特殊,因为对于日期的格式有N多中输入方式,比如: 2088-08-182088/08/1808/18/2088… 针对这么多日期格式,SpringMVC该如何接收,它能很好的处理日期类…

【MyBatis】验证多级缓存及 Cache Aside 模式的应用

文章目录 前言1. 多级缓存的概念1.1 CPU 多级缓存1.2 MyBatis 多级缓存 2. MyBatis 本地缓存3. MyBatis 全局缓存3.1 MyBatis 全局缓存过期算法3.2 CacheAside 模式 后记MyBatis 提供了缓存切口, 采用 Redis 会引入什么问题?万一遇到需强一致场景&#x…

零基础快速掌握——【c语言基础】数组的操作,冒泡排序,选择排序

1.数组 内存空间连续: 2.定义格式 数组的定义格式: 数组分为一维数组、二维数组、以及多维数组,不同类型的数组定义格式时不一样 2.1 一维数组的定义 数据类型 数组名 [数组长度]; 解释: 数据类型&#xff1…

SpringBoot3.4.0和OpenFeign4.1.4不兼容

SpringBoot3.4.0和OpenFeign4.1.4不兼容 SpringBoot升级到3.4.0版本,和OpenFeign不兼容,maven install 时报错,即使OpenFeign升到最新版本4.1.4,依然不兼容。 SpringBoot版本降为3.3.6 ,maven install 成功。 创建日…

PyTorch|彩色图片识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import torchvision.transforms as transforms i…

【Linux】应用层协议—HTTP

一、HTTP协议介绍 请求-响应模型:HTTP (Hyper Text Transfer Protocol) 协议是基于请求和响应的。客户端(如Web浏览器)发送一个HTTP请求到服务器,服务器处理请求后返回一个HTTP响应。 无状态,无连接协议:H…

消息中间件-Kafka1-实现原理

消息中间件-Kafka 一、kafka简介 1、概念 Kafka是最初由Linkedin公司开发,是一个分布式、支持分区(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以…

【Spring】Spring IOCDI:架构旋律中的“依赖交响”与“控制华章”

前言 🌟🌟本期讲解关于Spring IOC&DI的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么…

44 基于32单片机的博物馆安全监控系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 检测 分别是温湿度 光照 PM2.5、烟雾、红外,然后用OLED屏幕显示, 红外超过阈值则蜂鸣器报警,这是防盗报警;温度或烟雾超过阈值,则蜂鸣器…

VScode离线下载扩展安装

在使用VScode下在扩展插件时,返现VScode搜索不到插件,网上搜了好多方法,都不是常规操作,解决起来十分麻烦,可以利用离线下载安装的方式安装插件!亲测有效!!! 1.找到VScod…

文生视频、图生视频 AI 大模型开源项目介绍【持续更新】

Open-Sora 介绍:Open-Sora是一个由北京大学和兔展科研团队推出的开源项目,旨在推动视频生成技术的发展。Open-Sora致力于高效制作高质量视频,通过开源原则,使高级视频生成技术变得民主化,并提供一个简化且用户友好的平…

Burp Suite 实战指南:Proxy 捕获与修改流量、HTTP History 筛选与分析

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

基于Vue实现的移动端手机商城项目 电商购物网站 成品源码

📂文章目录 一、📔网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站演示 📸部分截图 🎬视频演示 五、⚙️网站代码 🧱项目结构 💒vue代码预览 六、🔧完整…

.NET 9 中 LINQ 新增功能实现过程

本文介绍了.NET 9中LINQ新增功能,包括CountBy、AggregateBy和Index方法,并提供了相关代码示例和输出结果,感兴趣的朋友跟随我一起看看吧 LINQ 介绍 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 数据查询历来都表示为简单的…

yarn install遇到问题处理

1、Yarn在尝试安装一个依赖项时遇到了问题。具体来说,这个错误指出期望提升(hoist)的包的manifest文件丢失了,这通常是因为缓存中的数据损坏或不一致所致。 解决方法:有以下两种 1、清除Yarn缓存:运行 yarn…

遇到问题:hive中的数据库和sparksql 操作的数据库不是同一个。

遇到的问题: 1、hive中的数据库和sparksql 操作的数据库不同步。 观察上面的数据库看是否同步 !!! 2、查询服务器中MySQL中hive的数据库,发现创建的位置没有在hdfs上,而是在本地。 这个错误产生的原因是&…

大数据-240 离线数仓 - 广告业务 测试 ADS层数据加载 DataX数据导出到 MySQL

点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop&#xff0…

计算机网络-网络安全

网络安全介绍 端口扫描 安全包括那些方面: 数据存储安全、应用程序安全、操作系统安全、网络安全、物理安全、用户安全教育 一、网络安全问题概述 1. 计算机网络面临的安全性威胁 计算机网络上的通信面临以下的四种威胁: 截获——从网络上窃听他人…