const one = (ctx, next) => {
console.log('>> one');
next();
console.log('<< one');
}
const two = (ctx, next) => {
console.log('>> two');
next();
console.log('<< two');
}
const three = (ctx, next) => {
console.log('>> three');
next();
console.log('<< three');
}
app.use(one);
app.use(two);
app.use(three);
输出结果:
>> one
>> two
>> three
<< three
<< two
<< one
Next的作用
我们在定义express中间件函数的时候都会将第三个参数定义为next,这个next函数主要负责将控制权交给下一个中间件,如果当前中间件没有终结请求,并且next没有被调用,那么当前中间件的请求将被挂起,等到next()后的中间件执行完再返回继续执行。总结来说,就是:
从第一个中间件开始执行,遇到next进入下一个中间件,一直执行到最后一个中间件,在逆序,执行上一个中间件next之后的代码,一直到第一个中间件执行结束才发出响应。如下代码
one = (ctx, next) => {
console.log('>> one');
next();----------------> two = (ctx, next) => {
console.log('>> two');
next();------------------> three = (ctx, next) => {
console.log('>> three');
next();--------------------|
//没有下一层,所以不再跳往下一层,直接执行当前层的下一步
console.log('<< three');<--|
}
console.log('<< two');
}
console.log('<< one');
}
Koa 的最大特色,就是中间件(middleware)Koa 应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行的。Koa中使用app.use()
用来加载中间件,基本上Koa 所有的功能都是通过中间件实现的。
每个中间件默认接受两个参数,第一个参数是 Context 对象,第二个参数是next
函数。只要调用next
函数,就可以把执行权转交给下一个中间件。每一个中间件就相当于洋葱的一层,请求从最外层进去,然后从最里层出来,每个中间件都会执行两次。three已经是最里层的中间件了,所以next()只是执行next后的代码,然后一层一层返回
下图为经典的Koa洋葱模型