77 # koa 中间件的应用

简介: 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);

目录
相关文章
|
5月前
|
中间件 程序员 开发工具
Django实践-08中间件的应用
Django实践-08中间件的应用
Django实践-08中间件的应用
|
7月前
|
前端开发 JavaScript 中间件
78 # koa 中间件的实现
78 # koa 中间件的实现
16 0
|
7月前
|
中间件 开发工具
使用 SAP Fiori Tools 提供的中间件导入本地下载的 SAP UI5 库文件来启动 SAP UI5 应用试读版
使用 SAP Fiori Tools 提供的中间件导入本地下载的 SAP UI5 库文件来启动 SAP UI5 应用试读版
82 0
|
15天前
|
中间件 API 文件存储
Django的扩展包与中间件:增强应用功能的利器
【4月更文挑战第15天】本文介绍了Django的扩展包和中间件,两者用于增强Django应用功能。扩展包是可重用的应用,提供额外功能,如用户认证和API开发。选择合适的扩展包,通过安装、配置,可轻松集成到项目中。中间件则在请求和响应之间执行操作,如身份验证和权限控制。创建中间件类并添加到settings.py中,实现特定功能。扩展包和中间件常结合使用,以实现更复杂的应用需求,提高开发效率和应用性能。
|
15天前
|
安全 中间件 数据处理
中间件在应用集成
中间件是应用集成的关键,它连接不同系统、平台和应用,解决兼容性问题,实现数据交换和功能互操作。主要应用包括数据集成、服务集成、消息传递、安全与权限管理。选择中间件需考虑兼容性、性能、可扩展性和安全性。中间件简化通信,提高系统性能和可靠性,助力企业实现应用高效协同和商业价值。
17 2
|
5月前
|
消息中间件 NoSQL 中间件
【Go电商实战05】结合商业项目讲解中间件的概念和应用
把Go语言中的知识点结合商业项目,理论联系实践,更好的学习理解,高效学,少踩坑。
|
7月前
|
存储 缓存 Java
详解Zookeeper(铲屎官)在众多中间件的应用和在Spring Boot业务系统中实现分布式锁和注册中心解决方案
`ZooKeeper `是一个**开放源码的分布式协调服务**,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应用程序可以基于` Zookeeper` 实现诸如**数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列**等功能。
22540 11
详解Zookeeper(铲屎官)在众多中间件的应用和在Spring Boot业务系统中实现分布式锁和注册中心解决方案
|
7月前
|
传感器 机器学习/深度学习 中间件
CLAID:关闭人工智能和数据收集的循环——一个用于智能边缘云和数字生物标记应用的跨平台透明计算中间件框架
CLAID:关闭人工智能和数据收集的循环——一个用于智能边缘云和数字生物标记应用的跨平台透明计算中间件框架
96 0
|
12月前
|
Web App开发 负载均衡 JavaScript
「应用中间件」使用NGINX作为WebSocket代理
「应用中间件」使用NGINX作为WebSocket代理
|
12月前
|
缓存 NoSQL 容灾
《Java应用提速(速度与激情)》——六、阿里中间件提速
《Java应用提速(速度与激情)》——六、阿里中间件提速