app.use(async(ctx, next) => {
console.log('start'); // 第一步
await next(); //next() 出错找不到路由, 是因为没有等待下一个中间件处理结果?
console.log('end');
})
app.use(async(ctx, next) => {
var p = await new Promise(resovle => { //打印等了2S
setTimeout(() => {
resovle(10);
}, 2000)
})
console.log(p);
await next(); //next貌似没有被执行
})
app.use(async(ctx, next) => {
ctx.body = 'hello world';
})
在使用koa2
的路由时, 遇到了如上问题,望大牛指教~
谢邀。
需要用
await next()
,不能只用next()
;这得从
koa
中间件内部的实现原理说起。app.use(async fn)
非常简单,大致如下,只是往middleware
数组里push了个中间件方法。在
app.listen(xx)
里面,把 this.middleware 进行了一点封装(细节略),最终的结果就是,当http请求进来时,koa会循环调用中间件,如下(非源码)。实际koa源码里比上面代码稍微复杂点,封装逻辑主要是为了让
await next()
调用时,进入下一个中间件。下面这段是实际的源码,其他可以不看,单看next
那里就行。可以看到
next
里面调用了dispatch
,这是个递归的过程,直到所有中间件调用完毕。