发现之前对koa的中间件的理解还不够完全,这里做点笔记。
这里主要需要理解next
函数。这个函数有几个点:
看几个例子:
app.use(async (ctx: Koa.Context, next: Koa.Next) => {
console.log("1a");
await next();
console.log("1b");
});
app.use(async (ctx: Koa.Context, next: Koa.Next) => {
console.log("2a");
await next();
console.log("2b");
});
app.use(async (ctx: Koa.Context, next: Koa.Next) => {
console.log("3a");
await next();
console.log("3b");
});
最后的输出是:
1a
2a
3a
3b
2b
1b
如果某个中间件没有调用next,则后续的调用链会中断。
app.use(async (ctx: Koa.Context, next: Koa.Next) => {
console.log("1a");
await next();
console.log("1b");
});
app.use(async (ctx: Koa.Context, next: Koa.Next) => {
console.log("2a");
});
app.use(async (ctx: Koa.Context, next: Koa.Next) => {
console.log("3a");
await next();
console.log("3b");
});
最后的输出是:
1a
2a
1b
如果在调用next的时候不使用await的话,当前的中间件触发下一个中间件的执行(异步)后不会等待后续中间件返回,后续的业务逻辑会立即
继续执行。会打乱洋葱回调的顺序。
app.use(async (ctx: Koa.Context, next: Koa.Next) => {
console.log("1a");
await next();
console.log("1b");
});
app.use(async (ctx: Koa.Context, next: Koa.Next) => {
console.log("2a");
next();
console.log("2b");
});
app.use(async (ctx: Koa.Context, next: Koa.Next) => {
console.log("3a");
await next();
console.log("3b");
});
最后的输出是:
1a
2a
3a
2b
3b
1b
主要有下面几点:
return next();
将调用链继续下去,否则后面的中间件将会失效await next();
,否则一律return next();
next().catch
之类的方式来进行错误处理EOF