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,一经查实,立即删除!

相关文章

Nuxt3配置局域网和移动端访问

Nuxt3配置局域网访问 这样配置的好处是,处于开发环境时,同一个局域网的其他伙伴可以通过IP地址端口号访问nuxt项目,方便其他人预览项目效果和进度。 nuxt.config.ts // https://nuxt.com/docs/api/configuration/nuxt-config const isDev …

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

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

Go的简单问题问答

基础问题回答 Go 的主要特点是什么? 简洁:语法简化,减少复杂性。并发:内置 Goroutine 和 Channel,支持轻量级并发。静态类型:强类型语言,编译时检查错误。跨平台:编译生成独立的二进…

泷羽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__()# 设置窗…

蓝桥杯每日一题-图书排序

这个题我一开始想着用Map类型,但是发现map类型没办法排序,于是各种尝试之后使用Book类Comparable接口实现了这个功能。 题目链接如下: 图书排序 AC代码如下: import java.util.ArrayList; import java.util.HashMap; import java…

云原生后端:解锁高效可扩展应用的魔法世界

目录 一、云原生后端的崛起:时代的必然选择 二、云原生后端的基石:容器化与 Docker (一)容器化的概念与优势 (二)Docker:容器化的明星工具 三、微服务架构:云原生后端的灵魂 &…

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

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

下载 M3U8 格式的视频

要下载 M3U8 格式的视频(通常是 HLS 视频流),可以尝试以下几种方法: 方法 1:使用下载工具(推荐) 1. IDM(Internet Download Manager): 安装 IDM 并启用浏…

【后端面试总结】Redis过期删除策略

Redis会将每个设置了过期时间的key放入一个独立的字典中,以后会定时遍历这个字典来删除到期的key。除了定时遍历之外,它还会使用惰性策略来删除过期的key。所谓惰性策略就是在客户端访问这个key的时候,Redis对key的过期时间进行检查&#xff…

祖先序列重建结合机器学习改进双键还原酶-文献精读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 看了好多毒文章,感觉写作业更有意思,可以了解新的知识 内容: 首先看毒文章是这样说的,华为的防火墙是…

CentOS使用chrony服务进行时间同步源设置脚本

CentOS使用chrony服务进行时间同步源设置脚本 #!/bin/bash# Created: 2024-11-26 # Function: Check and Set OS time sync source to 10.0.11.100 # FileName: centos_set_time_source_to_ad.sh # Creator: Anster # Usage: # curl http://webserver-ip/scripts/centos_set…

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专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…