什么是Koa?
- 将node原生的req和res封装成为一个context对象。
- 基于async/await的中间件洋葱模型机制。
Koa1和Koa2在源码上的区别有何不同?
- Koa1是使用generator、yield的模式。
- Koa2使用的是async/await + Promise的模式。
什么是洋葱模型?
const Koa = require('koa');
//Applications
const app = new Koa();
// 中间件1
app.use((ctx, next) => {
console.log(1);
next();
console.log(2);
});
// 中间件 2
app.use((ctx, next) => {
console.log(3);
next();
console.log(4);
});
app.listen(7000, '0.0.0.0', () => {
console.log(`Server is starting`);
});
源码解析
- use方法
- listen方法
- compose方法
function compose (middleware) {
// ...
return function (context, next) {
// last called middleware #
let index = -1
// 一开始的时候传入为 0,后续会递增
return dispatch(0)
function dispatch (i) {
// 假如没有递增,则说明执行了多次
if (i <= index) return Promise.reject(new Error('next() called multiple times'))
index = i
// 拿到当前的中间件
let fn = middleware[i]
if (i === middleware.length) fn = next
// 当 fn 为空的时候,就会开始执行 next() 后面部分的代码
if (!fn) return Promise.resolve()
try {
// 执行中间件,留意这两个参数,都是中间件的传参,第一个是上下文,第二个是 next 函数
// 也就是说执行 next 的时候也就是调用 dispatch 函数的时候
return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));
} catch (err) {
return Promise.reject(err)
}
}
}
}
为什么需要洋葱模型?
参考文献
【Node】深入浅出 Koa 的洋葱模型