中间件
使用
// 最外层中间件,可以用于兜底 Koa 全局错误
app.use(async (ctx, next) => {
try {
// console.log('中间件 1 开始执行')
// 执行下一个中间件
await next();
// console.log('中间件 1 执行结束')
} catch (error) {
console.log(`[koa error]: ${error.message}`)
}
});
// 第二层中间件,可以用于日志记录
app.use(async (ctx, next) => {
// console.log('中间件 2 开始执行')
const { req } = ctx;
console.log(`req is ${JSON.stringify(req)}`);
await next();
console.log(`res is ${JSON.stringify(ctx.res)}`);
// console.log('中间件 2 执行结束')
});
实现中间件
const app = {
middlewares: []
};
app.use = function(fn) {
app.middlewares.push(fn);
};
app.compose = function() {
function dispatch(index) {
// async 函数中 await 后面执行的异步代码要实现等待,带异步执行后继续向下执行,需要等待 Promise,
// 所以我们将每一个中间件函数在调用时最后都返回了一个成功态的 Promise
if (index === app.middlewares.length) return Promise.resolve();
const route = app.middlewares[index];
return Promise.resolve(route(() => dispatch(index + 1)));
}
dispatch(0);
}
module.exports = app;
装饰器和中间件
资料
- 给你一个开箱即用,功能完善的 koa 项目
- Koa2 进阶学习笔记
- Koa.js 设计模式-学习笔记
- Koa2 洋葱模型 ——— compose 串联中间件的四种实现
- 在Web应用中使用装饰器(Decorator)初体验