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回答
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()的目的,是为了更好捕获中间件执行过程中的错误。
相似问题