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);

目录
相关文章
|
1月前
|
消息中间件 存储 Apache
探索 RocketMQ:企业级消息中间件的选择与应用
RocketMQ 是一个高性能、高可靠、可扩展的分布式消息中间件,它是由阿里巴巴开发并贡献给 Apache 软件基金会的一个开源项目。RocketMQ 主要用于处理大规模、高吞吐量、低延迟的消息传递,它是一个轻量级的、功能强大的消息队列系统,广泛应用于金融、电商、日志系统、数据分析等领域。
68 0
探索 RocketMQ:企业级消息中间件的选择与应用
|
29天前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
7月前
|
开发框架 JavaScript 中间件
中间件应用Koa.js(Node.js)
【5月更文挑战第3天】我们添加了两个中间件。第一个中间件记录请求的开始时间,并在下一个中间件执行完毕后计算并打印出请求的总时间。第二个中间件与之前的示例相同,它设置响应体为 "Hello World"
60 6
中间件应用Koa.js(Node.js)
|
3月前
|
中间件 API 开发者
深入理解Python Web框架:中间件的工作原理与应用策略
在Python Web开发中,中间件位于请求处理的关键位置,提供强大的扩展能力。本文通过问答形式,探讨中间件的工作原理、应用场景及实践策略,并以Flask和Django为例展示具体实现。中间件可以在请求到达视图前或响应返回后执行代码,实现日志记录、权限验证等功能。Flask通过装饰器模拟中间件行为,而Django则提供官方中间件系统,允许在不同阶段扩展功能。合理制定中间件策略能显著提升应用的灵活性和可扩展性。
52 4
|
4月前
|
中间件 数据库连接 UED
Django中间件秘籍:如何用几行代码让你的应用变得超级强大?
【8月更文挑战第31天】中间件是Django框架的核心特性,位于视图与HTTP服务器之间,允许全局处理请求和响应,增强Web应用功能。通过实现`MiddlewareMixin`类的方法,如`process_request`和`process_response`,可以轻松实现请求预处理或响应后处理。中间件应用场景广泛,包括用户认证、CSRF防护和数据库连接管理等。创建并配置中间件需将其加入`settings.py`的`MIDDLEWARE`列表,顺序决定执行优先级。合理利用中间件能提高代码重用性和应用性能,带来更好的用户体验。
58 0
|
6月前
|
设计模式 监控 中间件
PHP中的中间件模式及其应用
【6月更文挑战第24天】在PHP开发中,中间件是一种设计模式,它允许开发者在请求处理流程的不同阶段插入自定义的处理逻辑。本文将介绍PHP中间件的概念、实现方式以及如何利用中间件提高代码的可维护性和扩展性。通过实际案例,我们将探索中间件在身份验证、日志记录和性能监控等方面的应用,并讨论如何在Laravel框架中有效使用中间件。
|
6月前
|
设计模式 中间件 API
PHP中的中间件模式及其应用
【6月更文挑战第24天】在现代Web开发中,设计模式的应用是提高代码可维护性和扩展性的关键。本文将深入探讨PHP中中间件模式的概念、实现方式以及在实际项目中的应用案例,旨在为开发者提供一种灵活处理HTTP请求和响应的有效手段。
|
6月前
|
中间件 开发者 C++
Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
|
5月前
|
缓存 监控 安全
中间件在Python Web框架中的角色与应用场景
【7月更文挑战第21天】中间件在Python Web开发中作为服务器与应用间的软件层,拦截、处理请求和响应,无需改动应用代码。它扩展框架功能,复用跨应用逻辑,加强安全,优化性能。如Django中间件处理请求/响应,Flask通过WSGI中间件实现类似功能,两者均在不触及核心代码前提下,灵活增强应用行为,是现代Web开发关键组件。
62 0
|
5月前
|
中间件 API 开发者
深入理解Python Web框架:中间件的工作原理与应用策略
【7月更文挑战第19天】Python Web中间件摘要:**中间件是扩展框架功能的关键组件,它拦截并处理请求与响应。在Flask中,通过`before_request`和`after_request`装饰器模拟中间件行为;Django则有官方中间件系统,需实现如`process_request`和`process_response`等方法。中间件用于日志、验证等场景,但应考虑性能、执行顺序、错误处理和代码可维护性。
90 0