1.logger
koa一个重要设计就是中间件,首先先看logger打印日志的功能。
console.log(`${Date.now()} ${ctx.request.method} ${ctx.request.url}`)
也可以拆分独立函数
const logger=(ctx,next)=>{
console.log(`${Date.now()} ${ctx.request.method} ${ctx.request.url}`);
next();
}
中间件就是在request和response请求之间实现中间功能。
app.use来加载中间件,其中中间件默认接收两个参数,第一个是context对象,第二个是next函数,调用next函数,就可以把执行权转交给下一个中间件。
2.中间件栈
多个中间件形成栈结构,先进后出。
1.最外层的中间件首先执行。
2.调用next函数把执行权交给下一个中间件。
3.最内层的中间件最后执行
4.执行结束执行权交给上一层中间件
5.最外层中间件收回执行权后,执行next函数之后的代码。
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
即先执行最外层one,执行到最内层,再执行最能层代码,最后最外层one收回执行权。
如果把two的next注释:
>> one
>> two
<< two
<< one
执行到two没有next因此不再执行。
3.异步中间件
异步中间件必须携程async函数形式。
const fs = require('fs.promised');
const Koa = require('koa');
const app = new Koa();
const main = async function (ctx, next) {
ctx.response.type = 'html';
ctx.response.body = await fs.readFile('./demos/template.html', 'utf8');
};
app.use(main);
app.listen(3000);
中间件必须携程async函数,fs.readFile是异步操作必须携程await
网友评论