78 # koa 中间件的实现

这篇具有很好参考价值的文章主要介绍了78 # koa 中间件的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上上节实现了上下文的,上一节使用了一下中间件,这一节来实现 koa 的中间件这个洋葱模型。

思路:

  • 储存用户所有的 callback
  • 将用户传递的 callback 全部组合起来(redux 里的 compose)
  • 组合成一个线性结构依次执行,组合完返回一个大的 promise
  • 当组合后的 promise 完成后,拿到最终的结果响应回去

application.js 代码实现如下:核心就是组合方法的实现

const EventEmitter = require("events");
const http = require("http");
const context = require("./context");
const request = require("./request");
const response = require("./response");

console.log("kaimo-koa---->");

class Application extends EventEmitter {
    constructor() {
        super();
        // 防止多个实例共享 context request response 需要进行拷贝
        this.context = Object.create(context);
        this.request = Object.create(request);
        this.response = Object.create(response);
        // 储存用户所有的 callback
        this.middlewares = [];
    }
    use(callback) {
        // 将用户传递的 callback 全部组合起来
        this.middlewares.push(callback);
    }
    // 创建一个上下文
    createContext(req, res) {
        // 每次请求都应该是一个全新的 context,需要拷贝
        let ctx = Object.create(this.context);
        // 上下文中有一个 request 对象,是自己封装的
        ctx.request = Object.create(this.request);
        // 上下文中还有一个 req 属性 指代的是原生的 req,自己封装的 request 对象上有 req 属性
        ctx.req = ctx.request.req = req;
        // 上下文中还有一个 response 对象,是自己封装的
        ctx.response = Object.create(this.response);
        // 上下文中还有一个 res 属性 指代的是原生的 res,自己封装的 response 对象上有 res 属性
        ctx.res = ctx.response.res = res;
        return ctx;
    }
    compose(ctx) {
        // 在数组中取出第一个,第一个执行后执行第二个
        const dispatch = (i) => {
            if (i === this.middlewares.length) return Promise.resolve();
            let middleware = this.middlewares[i];
            // 中间件如果不是 async 需要 Promise 包装一下,() => dispatch(i + 1) 就是 next
            return Promise.resolve(middleware(ctx, () => dispatch(i + 1)));
        };
        return dispatch(0);
    }
    async handleRequest(req, res) {
        const ctx = this.createContext(req, res);
        // 组合成一个线性结构依次执行,组合完返回一个大的 promise
        await this.compose(ctx);
        // 当组合后的 promise 完成后,拿到最终的结果响应回去
        let body = ctx.body;
        res.end(body);
    }
    listen(...args) {
        const server = http.createServer(this.handleRequest.bind(this));
        server.listen(...args);
    }
}

module.exports = Application;

然后我们编写测试 demo.js

const Koa = require("./kaimo-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);
    console.time("kaimo");
    await next();
    ctx.body = "hello 1";
    console.log(2);
    console.timeEnd("kaimo");
});

app.use(async (ctx, next) => {
    console.log(3);
    await log();
    ctx.body = "hello 2";
    await next();
    console.log(4);
});

app.use(async (ctx, next) => {
    console.log(5);
    ctx.body = "hello 3";
    await next();
    console.log(6);
});

app.listen(3000);

启动服务,访问 http://localhost:3000/

nodemon demo.js

78 # koa 中间件的实现,Node / Node 框架,前端工程架构,中间件,koa文章来源地址https://www.toymoban.com/news/detail-695997.html

到了这里,关于78 # koa 中间件的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 77 # koa 中间件的应用

    调用 next() 表示执行下一个中间件 洋葱模型: 输出: 135642 添加异步等待 输出: 132 kaimo313 564 koa 中要求每个 next 方法前面都必须增加 await 否则不存在等待效果 会取中间件第一个执行完的结果 koa 的中间件原理:会将所有的中间件组合成一个大的 promise,当这个 promise 执行完

    2024年02月09日
    浏览(30)
  • SpringBoot中间件—ORM(Mybatis)框架实现

    目录 定义 需求背景 方案设计 代码展示 UML图  实现细节 测试验证  总结 源码地址(已开源) :https://gitee.com/sizhaohe/mini-mybatis.git  跟着源码及下述UML图来理解上手会更快, 拒绝浮躁,沉下心来搞         ORM:Object Relational Mapping  --  对象关系映射,是一种程序设计技术,

    2024年02月16日
    浏览(25)
  • 第九篇:node静态文件服务(中间件)

     🎬 江城开朗的豌豆 :个人主页  🔥 个人专栏  :《 VUE 》 《 javaScript 》  📝  个人网站  :《 江城开朗的豌豆🫛 》  ⛺️ 生活的理想,就是为了理想的生活 ! 当今互联网时代,Node.js 成为了最受欢迎的服务器端开发平台之一。作为一名小白,学习 Node.js 可能会让你感

    2024年02月20日
    浏览(32)
  • cool Node后端 中实现中间件的书写

    1.需求 在node后端中,想实现一个专门鉴权的文件配置,可以这样来解释 就是 有些接口需要token调用接口,有些接口不需要使用token 调用  这期来详细说明一下      什么是中间件中间件顾名思义是指在请求和响应中间,进行请求数据的拦截处理,数据校验,并且进行逻辑处理

    2024年02月20日
    浏览(34)
  • 中间件框架知识进阶

    近期从不同渠道了解到了一些中间件相关的新的知识,记录一下收获。涉及到的中间件包括RPC调用、动态配置中心、MQ、缓存、数据库、限流等,通过对比加深理解,方便实际应用时候更明确如何进行设计和技术选型。 目前主流的RPC中间件包括Dubbo、HSF、Thrift、GRPC、Spring Cl

    2024年01月16日
    浏览(39)
  • express框架中间件

    说明:Express框架中间件是指在处理HTTP请求前或后对请求和响应进行处理的函数。具体而言,中间件可以: 执行一些公共的逻辑,比如身份验证、日志记录、错误处理等。 修改请求和响应,比如缓存、压缩等。 控制请求流,比如路由控制、URL重定向等。 Express中间件可以是一

    2024年02月13日
    浏览(28)
  • 【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件

    目录 前言 初识express 使用express创建基本的web服务器 初识express路由 路由匹配概念 路由模块化 中间件 中间件和路由的区别 定义中间件函数 中间件作用   局部生效中间价 中间件分类  1.应用级别中间件  2.路由级别的中间件  3.错误级别中间件  4.内置中间件  5.自定义中间

    2024年02月02日
    浏览(42)
  • gin框架内容(三)--中间件

    gin框架内容(三)--中间件 Gin框架允许开发者在处理请求的过程中,加入用户自己的函数。这个函数就叫中间件,中间件适合处理一些公共的业务逻辑,比 如登录认证、权限校验、数据分页、记录日志、耗时统 计等 即比如,如果访问一个网页的话,不管访问什么路径都需要

    2024年02月15日
    浏览(35)
  • Node.js 使用 cors 中间件解决跨域问题

    cors 是 Express 的一个第三方中间件。通过安装和配置 cors 中间件,可以很方便地解决跨域问题。 CORS (Cross-Origin Resource Sharing,跨域资源共享)由一系列 HTTP 响应头 组成, 这些 HTTP 响应头决定浏览器是否阻止前端 JS 代码跨域获取资源 。 浏览器的 同源安全策略 默认会阻止网

    2024年01月20日
    浏览(35)
  • 前端中间件Midway的使用

    Midway 是阿里巴巴 - 淘宝前端架构团队,基于渐进式理念研发的 Node.js 框架,通过自研的依赖注入容器,搭配各种上层模块,组合出适用于不同场景的解决方案。 Midway 基于 TypeScript 开发,结合了面向对象(OOP + Class + IoC)与函数式(FP + Function + Hooks)两种编程范式,并在此之

    2024年02月06日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包