Node web 框架 - Koa2 ( 简单实现代码,理解原理 )

 

  Node web 框架 - Koa2

  刚刚写了一个简单的 Express 流程的实现,来理解 Express 的原理。

  相比 Express,Koa2 更加的简单。

  1、Koa2 也是通过 use 添加函数来处理请求,不过是一个异步函数,并且传入的是一个上下文

  2、Koa2 在处理请求的时候,首先创建一个当前请求相关的上下文

  3、传入的异步函数,所以用 await 来实现一层一层处理上下文后( 洋葱模式的形式 )

  4、最后通过上下文的 body 来完成数据返回

 

  简单的代码实现:

const http = require('http')

class App {
    constructor() {
        this.middleware = []
    }

    use(fn) {
        this.middleware.push(fn)
    }

    // 链式模型
    compose() {
        const {middleware} = this
        return async function (ctx) {
            let index = 0
            const next = async function () {
                let handle = null
                while (!handle && index < middleware.length) {
                    handle = middleware[index++]
                }
                if (handle) return await handle(ctx, next)
                if (!handle) Promise.resolve()
            }
            await next();
        }
    }

    listen() {
        const callback = async (req, res) => {
            const handle = this.compose()
            const context = {
                response: res,
                request: req,
                app: this
            }
            await handle(context)
            res.end(context.body)
        }
        const server = http.createServer(callback)
        server.listen.apply(server, arguments)
    }
}

const app = new App()
app.use(async (ctx, next) => {
    ctx.body = 'one\n'
    await next()
    ctx.body += 'two\n'
})
app.use(async (ctx, next) => {
    ctx.body += 'three\n'
    await next()
    ctx.body += 'four\n'
})
app.listen(3300)

  

  代码仅供理解!

 

博客园小结巴巴: https://www.cnblogs.com/jiebba

 

posted @ 2020-04-26 17:08  小结巴巴吧  阅读(321)  评论(0编辑  收藏  举报