当前位置: 首页 > article >正文

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 = 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.kler.cn/a/421122.html

相关文章:

  • 【C++】—— set 与 multiset
  • SpringBoot两天
  • Python矩阵并行计算;CuPy-CUDA 实现显存加速:;在Python中实现显存加速或卸载;CuPy 和 NumPy 区别
  • UICollectionView在xcode16编译闪退问题
  • 《数据挖掘:概念、模型、方法与算法(第三版)》
  • shell脚本30个案例(五)
  • AcWing 841. 字符串哈希
  • 深入探索进程间通信:System V IPC的机制与应用
  • PLC协议
  • eBPF:现代Linux的强大内核扩展技术
  • docker搭建umami
  • PHM技术:一维信号时序全特征分析(统计域/频域/时域)| 信号处理
  • 【机器人】01 强化学习、模仿学习和运动规划 仿真平台ISAAC Lab安装与使用
  • 代码随想录-算法训练营day31(贪心算法01:分发饼干,摆动序列,最大子数组和)
  • 【CUDA】Kernel Atomic Stream
  • python学opencv|读取视频(一)灰度视频制作和保存
  • Nginx 转发代理天地图服务
  • adb导出系统apk
  • vulnhub靶场【哈利波特】三部曲之Aragog
  • std::thread()函数的第一个参数的使用细节
  • FreeSWITCH mod_conference 的按键会控
  • 【C++】智能指针的使用和原理
  • 总结拓展十七:特殊采购业务——委外业务
  • 数据结构——有序二叉树的删除
  • 【Tr0ll2靶场渗透】
  • 帮我写一篇关于AI搜索网页上编写的文章是否存在版权问题的文章, 字数在 3000 字左右。文心一言提问, 记录后用.