何为中间件?别被这个词吓到了!
中间件本质是函数
,在koa实例中使用use
方法,把函数作为参数传入,这个函数便可叫做中间件
如:
const Koa = require("koa")
const app = new Koa();
function sayHello() {
console.log("hello world");
}
app.use(sayHello)
app.listen(3000)
像上面的函数,就注册了一个名为sayHello
的中间件,启动服务,访问启动地址,随之打印出 hello world
也可以使用匿名函数:
app.use(() => {
console.log("hello world");
})
作用与第一段代码完全一致
注册多个中间件
app实例上可以注册多个中间件,但只会默认执行第一个
,想要让剩下的中间件执行,必须使用next()
如:
app.use((ctx, next) => {
console.log("1");
next();
})
app.use((ctx, next) => {
console.log("2");
})
ctx是上下文对象,next指的是下一个中间件函数
记住,`next()返回的是一个Promise对象`
洋葱模型
来这样一段代码吧:
app.use((ctx, next) => {
console.log("1");
next();
console.log("2");
})
app.use((ctx, next) => {
console.log("3");
next();
console.log("4");
})
执行输出1、3、4、2
原因,这就涉及到koa的所谓洋葱模型
了,为什么叫洋葱呢,其实就是从外面一层层的深入,再一层层的穿出来,不要那张经典的洋葱图了,来这一张;
形象直观了吧,执行fun1
函数,
函数里面如果有next(),
立即执行下一个中间件fun2
,即便这个中间件还有剩余的待执行语句,下一个中间件同理,直到完整执行完一个中间件,接着回头执行上一个剩下的
,再回头执行上一个剩下的
,直到把第一个剩下的语句执行完。
好了,把洋葱模型初步讲解完毕~~~~ 是不是很意外,不就是这点玩意么说的很玄乎一样~~ 其实这既是一个基理,怎么用还是得看个人 ~~~
严格保证中间件按洋葱模型执行
用async
、await
组合保证洋葱模型执行顺序
如
app.use(async (ctx, next) => {
console.log("1");
await next();
console.log("2");
})
可通过这个语糖获取下个中间件返回的值
app.use(async (ctx, next) => {
console.log("1");
const pro = await next();
console.log(pro);
console.log("2");
})
app.use((ctx, next) => {
console.log("3");
// next();
console.log("4");
return "4545"
})
依次输出
1
3
4
4545
2