Express:
基于NodeJS平台,快速,开放,极简的Web开发框架。
Koa2
Koa是基于Node.js平台的下一代Web开发框架,Koa是一个全新的Web框架,由Express原班人马打造,致力于成为Web应用和API开发领域中更小且更加富有表现力、更健壮的基石。通过async函数Koa帮你丢弃回调函数,并有力地增强错误处理。Koa并没有绑定任何中间件,而是提供了一套优雅的方法帮助快速编写服务器端应用程序。
Koa2相比较Koa1最大区别在于中间件的写法,Koa1使用Generator,Koa2使用async/await语法,因此Node.js必须大于v7.6.0+。
express使用中间件(static)访问静态资源,将中间件进行了封装在了express。
安装koa,和示例代码:
koa的中间件需要独立安装,并没有封装在koa中。
npm install koa-static
Github中学习Koa的源码:
github.com/koajs/koa
安装工具:
npm i mddir -D
Koa主流程梳理:
app.listen(3000);
执行过程:
1. 创建一个跟踪相应时间的时间戳;
2.等待下一个中间件执行完毕;
3.创建另一个logger的持续时间;
4.等待下一个中间件执行完毕;
5.将响应体设置为“Hello World”
6.计算出logger的持续时间;
7.输出logger
8.计算相应的持续时间;
9.将x-response-time响应头设置好;
10交给koa处理
koa的中间件:
中间件就是匹配路由(匹配任何路由或者特定的路由,其作用比如打印日志,查看权限)之前或者匹配路由完成之后所得一系列操作,功能有:
1.执行任何代码
2.修改请求和和响应对象
3.终结请求-响应循环
4.调用堆栈中的下一个中间件,通过next来实现。
1.应用级中间件:匹配路由之前所做的一系列操作
//中间件(中间件要放在use(route)之前):
//例如:一个匹配任何路由,打印时间的中间件
app.use(async (ctx,next)=>{
console.log(new Date());
await next()//当前路由匹配完成之后继续向下匹配,如果不写await next(),就会终止路由
})
2.路由级中间件:由于这个中间件只对这一个路由有作用,而不是对整个应用的路由都有作用,所以叫做路由级中间件
上面的这一段就是路由zjj的路由级中间件
router.get('/zjj', async (ctx, next) => {
console.log("zjj");
await next()//不写的话就不会继续向下匹配,也就是拿不到ctx.body
})
router.get('/zjj', async (ctx, next) => {
ctx.body = '中间件'
})
3.错误处理中间件,例如:
app.use(async (ctx,next)=>{
if(ctx.status==404){
ctx.status=404;
ctx.body="404页面"
}
})
4.中间件的执行顺序:
app.use(async (ctx,next)=>{
console.log("1");
await next();
console.log("3")
})
app.use(async (ctx,next)=>{
console.log("2");
await next()
console.log("4")
})
打印结果是:1,2,4,3
显而易见:在匹配路由之前,要执行next()之前的代码,匹配之后,要执行next()之后的代码,类似于进入洋葱和从洋葱中心离开。