async await middleware测试结果。

来源:2-3 Request属性、路由基础用法、app.use链式处理【原理篇】

TokugawaNakashima

2020-06-27 12:53:16

老师,我自己做了个小测试,在async middleware function里面没有在next()前加await,发现结果很正确。我这就不懂了。。。。请老师讲一下。谢谢老师啦。

const mid1: Middleware = async (ctx: Context, next: Koa.Next) => {
    console.log("mid1")
     next()
    console.log("mid1 end")
}

const mid2: Middleware = async (ctx: Context, next: Koa.Next) => {
    console.log("mid2")
     next()
    console.log("mid2 end")
}

const mid3: Middleware = async (ctx: Context, next: Koa.Next) => {
    console.log("mid3")
     next()
    console.log("mid3 end")
}

app.use(mid1).use(mid2).use(mid3)

app.listen(3000)

结果:

F:\Courses\learn_koa>npm start

> learn_koa@1.0.0 start F:\Courses\learn_koa
> tsc && node dist/index.js

mid1
mid2    
mid3    
mid3 end
mid2 end
mid1 end


写回答

1回答

Brian

2020-06-27

mid2 mid3并未返回Promise,koa会持续执行之后的mid2 mid3方法,然后再执行next()之后的console.log,相当于“同步”在执行洋葱模型。

如果mid2 mid3返回了promise,那么,next()这种写法会直接跳过,直接执行next()之后的console.log,而非洋葱模型。

平时在所有的方法都返回async/await(即返回promise时),写await next()或者写 return next()结果是一样的。

写return await next()的目的,是为了更好捕获中间件执行过程中的错误。

0

0 学习 · 1842 问题

查看课程