=================================================
https://cloud.tencent.com/developer/article/1467268
其实在执行中间件上都是一层一层的进去,但是express的需要手动写res.end ,这样写完之后,前面的层的中间件中中就不能操作响应了
而 koa的response在最外层
”
仔细看一下koa除了调用next的时候前面加了一个await好像和express没有任何区别,都是函数嵌套,都是洋葱模型。但是咱们回过头再仔细看一下文章最上面koa的运行代码,koa是在哪里响应的用户请求呢?koa中好型并没有cxt.send这样的函数,只有cxt.body,但是调用cxt.body并不是直接结束请求返回响应啊,和express的res.send有着本质上的不同。下面引用一段其他网友总结的express和koa中间件机制的不同,我个人感觉总结的很到位:
其实中间件执行逻辑没有什么特别的不同,都是依赖函数调用栈的执行顺序,抬杠一点讲都可以叫做洋葱模型。Koa 依靠 async/await(generator + co)让异步操作可以变成同步写法,更好理解。最关键的不是这些中间的执行顺序,而是响应的时机,Express 使用 res.end() 是立即返回,这样想要做出些响应前的操作变得比较麻烦;而 Koa 是在所有中间件中使用 ctx.body 设置响应数据,但是并不立即响应,而是在所有中间件执行结束后,再调用 res.end(ctx.body) 进行响应,这样就为响应前的操作预留了空间,所以是请求与响应都在最外层,中间件处理是一层层进行,所以被理解成洋葱模型,个人拙见。
这个流程可以从源码 compse(middlewares) 后形成的函数执行处看到,这个合并的函数执行后有个 .then((ctx) => { res.end(ctx.body) }) 的操作,我们也可以通过在不同中间件中都设置 ctx.body,会发现响应数据被一次次覆盖。
核心就是请求的响应的时机不同,express是在调用res.send就结束响应了,而koa则是在中间件调用完成之后,在洋葱的最外层,由koa调用res.send方法。
“
================================================
注意这张对koa洋葱圈解释的图片,响应是在最外层的,而express需要你在中间件中去res.end,里面都是回调,没法使用ayncawait那种同步的语法