资讯专栏INFORMATION COLUMN

koa2 一网打尽(基本使用,洋葱圈,中间件机制和模拟,源码分析(工程,核心模块,特殊处理),核心点

william / 1874人阅读

摘要:洋葱圈处理模型。基于的灵活强大的中间件机制。参考官网提供的基本,不在赘述部分实现,参考源码分析常用服务端口监听返回适用于方法的回调函数来处理请求。

本文 github 地址: https://github.com/HCThink/h-blog/blob/master/source/koa2/readme.md

github 首页(star+watch,一手动态直达): https://github.com/HCThink/h-blog

掘金 link , 掘金 专栏

segmentfault 主页

原创禁止私自转载

koa2

koa homepage

优秀的下一代 web 开发框架。
Koa 应用程序不是 HTTP 服务器的1对1展现。 可以将一个或多个 Koa 应用程序安装在一起以形成具有单个HTTP服务器的更大应用程序。
基础使用 快速搭建简易 koa server 服务

koa 搭建一个服务还是很简单的, 主要代码如下, 完整代码如下. 切到主目录下,

安装依赖: yarn

执行入口: yarn start

koa demo 目录

koa demo 主文件

import Koa from "koa";
import https from "https";
import open from "open";

const Log = console.log;
const App = new Koa();

App.use(async (ctx, next) => {
    ctx.body = "Hello World";
    Log("mid1 start...");
    await next();
    Log("mid1 end...");
});

App.use(async (ctx, next) => {
    debugger;
    Log("mid2 start...");
    await next();
    Log("mid2 end...");
});


App.use((ctx, next) => {
    Log("mid3...");
});

// 服务监听: 两种方式。
App.listen(3000);           // 语法糖
// http.createServer(app.callback()).listen(3000);
https.createServer(App.callback()).listen(3001);

open("http://localhost:3000");

// 如下为执行顺序, 实际上 http 会握手,所以输出多次
// 如下执行特征也就是洋葱圈, 实际上熟悉 async、await 则不会比较意外。
// mid1 start...
// mid2 start...
// mid3...
// mid2 end...
// mid1 end...
koa2特性

封装并增强 node http server[request, response],简单易容。

洋葱圈处理模型。

基于 async/await 的灵活强大的中间件机制。

通过委托使得 api 在使用上更加便捷易用。

api

参考官网提供的基本 api ,不在赘述: https://koa.bootcss.com/

部分 api 实现,参考: 源码分析

常用 api

app.listen: 服务端口监听

app.callback: 返回适用于 http.createServer() 方法的回调函数来处理请求。你也可以使用此回调函数将 koa 应用程序挂载到 Connect/Express 应用程序中。

app.use(function): 挂载中间件的主要方法。

核心对象
context

Koa Context 将 node 的 request 和 response 对象封装到单个对象中,为编写 Web 应用程序和 API 提供了许多有用的方法。 这些操作在 HTTP 服务器开发中频繁使用,它们被添加到此级别而不是更高级别的框架,这将强制中间件重新实现此通用功能。__每个__ 请求都将创建一个 Context,并在中间件中作为接收器引用,或者 ctx 标识符。

ctx.res request

ctx.req: response

ctx.request: koa request tool

ctx.response: koa response tool

ctx.cookies

ctx.request.accepts(types): type 值可能是一个或多个 mime 类型的字符串,如 application/json,扩展名称如 json,或数组 ["json", "html", "text/plain"]。

request.acceptsCharsets(charsets)

...

更多参考

洋葱圈 使用层面

koa 洋葱圈执行机制图解

koa 洋葱圈

koa demo, koa demo 源码

洋葱圈简易实现版

执行方式: tsc onionRings.ts --lib "es2015" --sourceMap && node onionRings.js

洋葱圈简易实现版 main, 洋葱圈简易实现版 源码

简易实现 外部中间件

参考: koa-bodyparser

main code
public use(middleware: Function) {
    this.middList.push(middleware);
}

// 执行器
private async deal(i: number = 0) {
    debugger;
    if (i >= this.middList.length) {
        return false;
    }
    await this.middList[i](this, this.deal.bind(this, i + 1));
}
实现思路

use 方法注册 middleware。

deal 模拟一个执行器: 大致思路就是将下一个 middleware 作为上一个 middleware 的 next 去 await,用以保证正确的执行顺序和中断。

问题
如果习惯了回调的思路, 你会不会有这种疑惑: 洋葱圈机制于在 一个中间件中调用另一个中间件,被调中间件执行成功,回到当前中间件继续往后执行,这样不断调用,中间件很多的话, 会不会形成一个很深的函数调用栈? 从而影响性能, 同时形成「xx 地狱」?        -- ps(此问题源于分享时原同事 小龙 的提问。)

实际上这是个很好的问题,对函数执行机制比较了解才会产生的疑问。排除异步代码处理,我们很容易用同步方式模拟出这种调用层级。参考: 同步方式。 这种模式存在明显的调用栈问题。

我可以负责任的回答: 不会的,下一个问题。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/100014.html

相关文章

  • KOA2框架原理解析实现

    摘要:实现的四大模块上文简述了源码的大体框架结构,接下来我们来实现一个的框架,笔者认为理解和实现一个框架需要实现四个大模块,分别是封装创建类构造函数构造对象中间件机制和剥洋葱模型的实现错误捕获和错误处理下面我们就逐一分析和实现。 什么是koa框架?        koa是一个基于node实现的一个新的web框架,它是由express框架的原班人马打造的。它的特点是优雅、简洁、表达力强、自由度...

    tracymac7 评论0 收藏0
  • KOA2框架原理解析实现

    摘要:实现的四大模块上文简述了源码的大体框架结构,接下来我们来实现一个的框架,笔者认为理解和实现一个框架需要实现四个大模块,分别是封装创建类构造函数构造对象中间件机制和剥洋葱模型的实现错误捕获和错误处理下面我们就逐一分析和实现。 什么是koa框架?        koa是一个基于node实现的一个新的web框架,它是由express框架的原班人马打造的。它的特点是优雅、简洁、表达力强、自由度...

    liangzai_cool 评论0 收藏0
  • koa源码阅读[1]-koa与koa-compose

    摘要:接上次挖的坑,对相关的源码进行分析第一篇。和同为一批人进行开发,与相比,显得非常的迷你。在接收到一个请求后,会拿之前提到的与来创建本次请求所使用的上下文。以及如果没有手动指定,会默认指定为。 接上次挖的坑,对koa2.x相关的源码进行分析 第一篇。 不得不说,koa是一个很轻量、很优雅的http框架,尤其是在2.x以后移除了co的引入,使其代码变得更为清晰。 express和ko...

    vibiu 评论0 收藏0
  • 超轻量级web框架koa源码阅读

    摘要:是一个非常轻量的框架,里面除了和之外什么都没有,甚至连最基本的功能都需要通过安装其他中间件来实现。而的源码同样很简洁,基础代码只有不到行,非常适合阅读学习。的源码直接从获取,本文采用目前最新的版本。 koa是一个非常轻量的web框架,里面除了ctx和middleware之外什么都没有,甚至连最基本的router功能都需要通过安装其他中间件来实现。不过虽然简单,但是它却非常强大,仅仅依靠...

    inapt 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<