koa中的中间件
1 | const Koa = require('koa'); |
执行下面的代码,然后在浏览器中输入127.0.0.1:3000,终端依次打印出 first second
。
洋葱模型
1 | const Koa = require('koa'); |
执行上面的代码,然后在浏览器中输入127.0.0.1:3000,终端会依次打印出 1 3 4 2
。
next返回值
1 | const Koa = require('koa'); |
执行上面的代码,然后在浏览器中输入127.0.0.1:3000,终端会依次打印 1 3 4 Promise { 'abc' } 2
,如果没有 return "abc";
,那么 a 为 Promise { undefined }
,可以看到,next() 的返回值就是 Promise
。
await async
求值
加上 await
和 async
确保按洋葱顺序执行,如果不加上,很难保证按洋葱顺序执行。
1 | const Koa = require('koa'); |
执行上面的代码,然后在浏览器中输入127.0.0.1:3000,终端会依次打印 1 3 4 abc 2
。
如果使用 .then
,那么结果就不一样了,如下:
1 | const Koa = require('koa'); |
执行上面的代码,在浏览器中输入127.0.0.1:3000,终端会依次打印 1 3 4 2 abc
阻塞
1 | const Koa = require('koa'); |
1 | const Koa = require('koa'); |
比较上面的代码,第二段代码把异步变成了同步,所以 end-start
会变得很大
ctx
1 | const Koa = require('koa'); |
express中的中间件
1 | const express = require('express'); |
执行上面的代码,然后在浏览器中输入127.0.0.1:3000,终端会依次打印出 1 2 3
。
分类
应用级中间件
路由级中间件
错误处理中间件
内置中间件
第三方中间件
举例
1 | const express = require('express'); |
上面这段代码,在浏览器中输入 http://127.0.0.1:3000
只会打印出 1,输入 http://127.0.0.1:3000/a
会依次打印出 1 2 a,输入 http://127.0.0.1:3000/b
回依次打印出 1 3。