源码和测试代码放在了:dongyuanxin/simple-koa

准备

设计思想和第三方库原理都在前 2 篇详细说明了。这篇主要目的是做一个验证检验,在语法使用 ES6/7 的语法。

在开始前,安装一下需要用到的库:

npm install --save koa-compose koa-convert is-generator-function

测试文件

为了说明效果,先按照正常使用 koa 的逻辑编写了测试文件。当启动它的时候,它的预期行为是:

代码如下:

const Koa = require("./lib/application");
const server = new Koa();
async function middleware1(ctx, next) {
    console.log("1 inner");
    await next();
    console.log("1 outer");
}
async function middleware2(ctx, next) {
    ctx.res.body = "hello";
    console.log("2 inner");
    await next();
    console.log("2 outer");
}
server.use(middleware1);
server.use(middleware2);
server.listen(3000);

玩具 koa

只准备了一个文件,跑通上面的逻辑即可。文件是 lib/application.js

构造函数

首先对外暴露的就是一个继承 Emitter 的 Application 类。整体框架如下:

const http = require("http");
const Emitter = require("events");
const compose = require("koa-compose");
module.exports = class Application extends Emitter {
    constructor() {
        super();
        this.middleware = []; // 中间件
        this.context = {}; // 上下文
        this.request = {}; // 请求信息
        this.response = {}; // 返回信息
    }
    listen(...args) {}
    use(fn) {}
    callback() {}
    handleRequest(ctx, fnMiddleware) {}
    createContext(req, res) {}
    onerror(error) {
        console.log(`error occurs: ${error.message}`);
    }
};

继承 Emitter 事件类,是为了方便监听和处理报错。

Powered by Fruition