[路飞]_node-koa洋葱圈

150 阅读1分钟

node框架——koa

如下是koa的基本语法(koa 需进行npm等方式进行安装)

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


app.use(async (ctx, next) => {
    ctx.body = '1';
    await next();
    ctx.body += '2';
});


app.use(async (ctx, next) => {
    ctx.body += '3';
    await next();
    ctx.body += '4'
});

app.use(async (ctx, next) => {
    ctx.body += '5';
});


app.listen(3000);

在页面上显示的结果是: 1 3 5 4 2;,这是这个框架非常核心的一个地方洋葱圈模式

洋葱圈模型

image.png

这就是该模型的抽象图,如果这图不好理解的话,实际上看代码会好理解一些,await next() 这里实际上就是进入到了下一个use里去,如果下一个use中还有next 那就继续进入到下一个use中 如果没有了,那就返回到最近一个的await next()中去执行后面的代码 执行完成后又接着去寻找最近一个await next()

洋葱圈模式简略实现方案

compose(middlewares) {
        return function(ctx) {
            return dispatch(0);
            function dispatch(i) {
                let fn = middlewares[i];
                if (!fn) {
                    return Promise.resolve()
                }
                return Promise.resolve(
                    fn(
                        ctx,
                        function next() {
                            return dispatch(i + 1)
                        }
                    )
                )
            }
        }
    }

compose 方法中的参数实际上就是调用use方法是 将callback添加到了middleware数组中,在compose里执行递归调用,这里ctx是上下文的概念,koa中将respones,requset整合到了ctx中方便对外暴露,整合本质就是利用了对象中的set 与 get方法