多个中间件执行顺序
多个中间件会形成一个栈结构(middle stack),以"先进后出"(first-in-last-out)的顺序执行。
- 最外层的中间件首先执行。
- 调用next函数,把执行权交给下一个中间件。
... - 最内层的中间件最后执行。
- 执行结束后,把执行权交回上一层的中间件。
... - 最外层的中间件收回执行权之后,执行next函数后面的代码。请看下面的例子
const Koa = require("koa");
const app = new Koa();
let arr;
// 第一个中间件
app.use(async (ctx, next) => {
arr = [];
arr.push(1);
await next();
arr.push(2);
});
// 第二个中间件
app.use(async (ctx, next) => {
arr.push(3);
await next();
arr.push(4);
});
// 第三个中间件
app.use(async (ctx, next) => {
arr.push(5);
await next();
arr.push(6);
});
// 输出
app.use(async ctx => {
arr.push(7);
ctx.body = arr;
});
app.listen(3000, () => {
console.log("server start at http://127.0.0.1:3000");
});
// 最后方法 http://127.0.0.1 的结果就得到 [1,3,5,7,6,4,2]
异步中间件
如果有异步操作(比如读取数据库),中间件就必须写成 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);