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

77 # koa 中间件的应用

调用 next() 表示执行下一个中间件

const Koa = require("koa");const app = new Koa();app.use(async (ctx, next) => {console.log(1);next();console.log(2);
});app.use(async (ctx, next) => {console.log(3);next();console.log(4);
});app.use(async (ctx, next) => {console.log(5);next();console.log(6);
});app.listen(3000);

洋葱模型:

在这里插入图片描述

输出:135642
在这里插入图片描述

添加异步等待

const Koa = require("koa");const app = new Koa();const log = () => {return new Promise((resolve, reject) => {setTimeout(() => {console.log("kaimo313");resolve();}, 3000);});
};app.use(async (ctx, next) => {console.log(1);next();console.log(2);
});app.use(async (ctx, next) => {console.log(3);await log();next();console.log(4);
});app.use(async (ctx, next) => {console.log(5);next();console.log(6);
});app.listen(3000);

输出:132 kaimo313 564

在这里插入图片描述

koa 中要求每个 next 方法前面都必须增加 await 否则不存在等待效果

const Koa = require("koa");const app = new Koa();const log = () => {return new Promise((resolve, reject) => {setTimeout(() => {console.log("kaimo313");resolve();}, 3000);});
};app.use(async (ctx, next) => {console.log(1);next();console.log(2);ctx.body = "hello 1";
});app.use(async (ctx, next) => {console.log(3);await log();ctx.body = "hello 2";next();console.log(4);
});app.use(async (ctx, next) => {console.log(5);ctx.body = "hello 3";next();console.log(6);
});app.listen(3000);

会取中间件第一个执行完的结果
在这里插入图片描述

koa 的中间件原理:会将所有的中间件组合成一个大的 promise,当这个 promise 执行完毕后,会采用当前的 ctx.body 进行结果的响应(next 前面必须要有 await 或者 return 否则执行顺序可能达不到预期)

如果都是同步执行,加不加 await 都无所谓,由于不知道后续是否有异步逻辑,写的时候都要加上 await

next():

  1. 可以把多个模块通过 next 方法来链接起来
  2. 可以决定是否向下执行(可以用来实现后台的权限)
  3. 可以封装一些方法,在中间件中,封装向下执行

实现中间件计时器

const Koa = require("koa");const app = new Koa();const log = () => {return new Promise((resolve, reject) => {setTimeout(() => {console.log("kaimo313");resolve();}, 3000);});
};app.use(async (ctx, next) => {console.time("kaimo");await next();ctx.body = "hello 1";console.timeEnd("kaimo");
});app.use(async (ctx, next) => {await log();ctx.body = "hello 2";return next();
});app.use(async (ctx, next) => {ctx.body = "hello 3";return next();
});app.listen(3000);

在这里插入图片描述

http://www.lryc.cn/news/160953.html

相关文章:

  • 【css】z-index与层叠上下文
  • 系统架构设计师(第二版)学习笔记----多媒体技术
  • 【面试经典150 | 数组】合并两个有序数组
  • 系统架构设计专业技能 ·操作系统
  • CSP 202209-1 如此编码
  • windows安装向量数据库milvus
  • Qt中,QScript对JavaScript的内置接口支持情况
  • C语言基础-typedef的用法
  • Linux中安装MySQL5.7.42
  • 网络基础--1.网络纵横
  • Django TypeError: Abstract models cannot be instantiated.错误解决方案
  • vscode使用delve调试golang程序
  • 如何从任何苹果、Windows或安卓设备访问iCloud照片
  • 关于“找不到mfc140u.dll,无法继续执行代码”问题的分析处理方法
  • 用 TripletLoss 优化bert ranking
  • Tomcat安装及使用
  • 法国新法案强迫 Firefox 等浏览器审查网站
  • 开源电商项目 Mall:构建高效电商系统的终极选择
  • QT(9.1)对话框与事件处理
  • C++项目实战——基于多设计模式下的同步异步日志系统-③-前置知识补充-设计模式
  • C++ 新旧版本两种读写锁
  • ES6 字符串的repeat()方法
  • 【车载以太网测试从入门到精通】系列文章目录汇总
  • LLM推理优化技术综述:KVCache、PageAttention、FlashAttention、MQA、GQA
  • go开发之个微机器人的二次开发
  • 2023国赛数学建模B题思路代码 - 多波束测线问题
  • SpringAOP面向切面编程
  • A Guide to Java HashMap
  • LeetCode 449. Serialize and Deserialize BST【树,BFS,DFS,栈】困难
  • 嵌入式IDE(1):IAR中ICF链接文件详解和实例分析