前言
koa最大的特点就是中间件流程控制,是典型的洋葱模型.
洋葱模型
下图可以清晰的看出,经过中间件从请求到响应的过程.先从外到内,然后从内到外.
koa是完全依赖异步编程的,最重要的维护context和next这两个变量.
当第一个中间件next执行的时候,会阻塞当前,等待第二个中间件的执行.当中间件中没有调用next时开始逆向执行
常用的中间件
-
koa-router (路由)
-
koa-views + ejs (后端渲染)
-
koa-logger (日志)
-
koa2-cors (跨域)
简易版代码
const middleware = [];
let mw1 = async function (ctx, next) {
console.log("next前,第一个中间件");
await next();
console.log("next后,第一个中间件");
};
let mw2 = async function (ctx, next) {
console.log("next前,第二个中间件");
await next();
console.log("next后,第二个中间件");
};
let mw3 = async function (ctx, next) {
console.log("第三个中间件,没有next了");
};
function use(mw) {
middleware.push(mw);
}
use(mw1);
use(mw2);
use(mw3);
let compose = function (ctx) {
return dispatch(0);
function dispatch(i) {
let currentMW = middleware[i];
if (!currentMW) {
return;
}
return currentMW(ctx, dispatch.bind(null, i + 1));
}
};
compose();