likes
comments
collection
share

手把手带你造轮子系列之Koa篇(一)

作者站长头像
站长
· 阅读数 33

手把手带你造轮子系列之Koa篇(一)

概览:Koa是一个基于Node.js平台的下一代Web框架,Express的原班人马打造, 旨在为现代Web应用程序提供更有表达力更健壮的支撑。Koa的核心思想是使用ES6中的Async/Await语法解决异步流程控制问题,并采用了独特的中间件机制来处理请求和响应,使得Koa非常适合用于编写高效简洁、灵活、可扩展、易维护的Web应用程序。

Koa篇将依照Koa源码及实现原理带你一步一步构建一个可用的MiniKoa。此篇是Koa系列的 第一篇,通过Koa的最基础用法,构建它的核心类Application, 完成一个简单的没有中间件系统的MiniKoa。

koa示例

下面我们从一个最简的Koa应用开始,可以看到通过下面几行简单的js代码我们就可以构建 一个可以处理请求响应的Web服务器,虽然它很简单,没有任何工程价值,但是我们会在后 续的讨论中不断的扩充这个例子,在不断添加需求的过程中一步一步的完善我们的MiniKoa库。

    const Koa = require('koa');
    const app = new Koa();

    app.use(async ctx => {
        ctx.body = 'Hello World';
    });

    app.listen(3000);
构建Application类

从上面例子我们可以看出,Koa是一个类,通过实例化这个类,可以获得一个最核心的对象app,通过调用app的use方法去注册一个中间件用来处理请求和响应,最后,调用listen方法监听3000端口,这样我们就可以处理来自浏览器的请求了。下面我们开始代码的编写,创建一个application.js。

const http = require("http");
module.exports = class Application {
    constructor() {
        this.callback = null;
    }
};

上面所示代码引入NodeJS的原生http模块,用于创建服务,我们创建一个Application类并导出,在构造函数中声明成员变量callback用来存储用户的处理函数。接下来我们要添加use方法。

添加use方法
 use(fn) {
    if (typeof fn !== "function")
    throw new TypeError("middleware must be a function");
    this.callback = fn;
 }

use方法很简单,先判断用户传入是否是函数,如果不是函数抛出一个错误,接着用成员变量callback接收用户注册的回调函数。现在需要添加listen方法用来创建服务和处理用户请求。

添加listen方法
listen(...args) {
    const server = http.createServer((req, res) => {
        const ctx = this.createContext(req, res);
        this.callback && this.callback(ctx);
        this.handleRequest(ctx);
    });
    return server.listen(...args);
}

listen方法用来创建一个NodeJS的原生http服务并监听端口,在服务的回调函数中创建context,然后调用用户注册的回调函数并传递生成的context。下面我们以前看下createContext和handleRequest的实现。

添加createRequest和handleRequest方法
 createContext(req, res) {
    const ctx = {
        _body: "",
        get body() {
            return this._body;
        },
        set body(val) {
            this._body = val;
        },
        req: req,
        res: res
    };
    return ctx;
}

handleRequest(ctx) {
    const { res, body } = ctx;
    res.statusCode = body ? 200 : 404;
    return res.end(body);
}

createContext函数主要用来创建上下文对象,将原生http模块的req和res对象挂载在context上(上下文是Koa的核心概念,后面我们会重点介绍)方便我们对响应和请求的处理,然后设置body的属性访问器,用于接收用户返回客户端的数据。handleRequest方法只需要通过http模块的res方法设置请求的状态码并且向浏览器返回存在body上的数据。

上面的代码虽然很简单,但是确实已经实现了我们最基本的需求(当然有很不完善的地方,我们后续会一步一步完善),小伙伴们可以试下最开始的例子,看是否能正常运行。今天我们的目标已经达成,后续会继续带领大家一步一步完善我们的MiniKoa。

转载自:https://juejin.cn/post/7202514143340036133
评论
请登录