node.js系列10 koa2框架

Posted lin_fightin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node.js系列10 koa2框架相关的知识,希望对你有一定的参考价值。

Koa2

koa是express的下一代框架,他是express同一个团队,koa2具有更强的异步处理能力。

koa初体验

在这里插入图片描述
与express不同的是导出的还是一个类,而且中间件的参数也只变成了两个,ctx上下文,和Next(源码是dispatch)
在这里插入图片描述
请求没结果,直接not found,这也是与express区别的地方,express是没返回直接挂起来,koa是没返回就直接not fountd在这里插入图片描述
在这里插入图片描述
这就是一个简单的koa服务器。

koa的中间件,

通过koa创建的app,注册中间件只能使用use方法,koa没有提供app.get/post,这些,也没有提供路劲匹配,比如app.use(’/xx’,()=>{})这些东西,而且也没有提供连续注册中间件的方式。

基本使用

在这里插入图片描述
这样其实写着很麻烦,路由使用会简单很多

路由使用

koa没有集成router,不像express,所以yarn add koa-router
在这里插入图片描述
这里的用法跟express的大同小异,express是直接Admin = express.routes()然后再app.use(’/Admin’, Admin)去匹配,
而koa-router是直接作为参数new一个类出来,然后再注册app.use(),而路由是有methods方法的,比如router.get/put/post,而且可以匹配。
在这里插入图片描述
当没有匹配的方法时,koa-router也提供了好用的方法
在这里插入图片描述
只有在相同路劲且不匹配的方法时才会提示,路劲不同也是提示not found。

参数的处理

get请求的params - query
post的json/urlencode还有文件上传(form-data)

query

在这里插入图片描述
key在这里插入图片描述

params

而params是
在这里插入图片描述
必须使用路由匹配到才会有ctx.request.params参数。

post请求体解析

json || urlencoded

koa没有像express提供的express.json这些,所以要依赖第三方库
yarn add koa-bodyparser
在这里插入图片描述
只需要两部就可以解析json/urlencoded的数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

form-data + 文件上传

form-data

上面那个库不能解析form-data
yarn add koa-multer
在这里插入图片描述
在这里插入图片描述
用了koa-multer
在这里插入图片描述
使用的话也是跟express极其类似,只不过不在ctx.request里面,而在ctx.req里面
在这里插入图片描述
在这里插入图片描述

文件上传

图片上传,也很简单,跟express差不多
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果想配置后缀以及名字,也跟express一样
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据的响应

我们一般通过Body返回数据,可以是字符串,二进制,Stream,对象、数据, null,不设置status的时候默认是200或204。
在这里插入图片描述
在这里插入图片描述
设置内容以及状态码。
返回数据可以通过ctx.response.body也可以通过ctx.body = xxx效果一样,那为什么可以这样呢?
其实ctx.body 是ctx.response.body的代理,运行ctx.body本质上是运行ctx.response.body。
其实ctx.query跟ctx.reqeust.query本质是一样的,在这里插入图片描述

源码如图,运行下面的ctx.body,本质上是运行ctx.response.body。ctx.request也做了类似的代理。

静态服务器

express有内置开放静态服务器的功能,koa需要依赖第三方库
yarn add koa-static
在这里插入图片描述
开放uploads在这里插入图片描述
这个与express的区别是我们的express是匹配到uploads才去开放资源,而koa是以当前目录下的uploads开放,所以直接访问就行。

错误处理方式

在这里插入图片描述
类似于发送事件监听事件一样,有错误就ctx.app.emit发送error事件,error只是个名字,可以用其他代替。然后第二三个参数就传给下面的app.on监听函数,传过去err和一个ctx。
在这里插入图片描述
一般的错误处理这种操作就好。

KOA简单源码解读

new Koa()

在这里插入图片描述
导出的koa是一个类,new的时候执行构造函数创建了像上下文context, request, reponse等对象,还有一个数据middleware,一看就是来处理中间件的。

app.listen

在这里插入图片描述
可以看到也是调用http.createServer
里面的callback就是处理响应数据的
在这里插入图片描述
拿到中间件的函数,然后处理
在这里插入图片描述
这里的then调用hadnleResponse,有多个中间件写ctx.body时,是不会全部返回的,只会返回最后一个执行handleResponse的中间件。ctx.body+=’’,就不一样,因为不是重新赋值。

app.use()

在这里插入图片描述
直接判断传进来的fn是不是函数,并把它塞进middleware中。

koa与express区别

从架构上说,express完整且强大,内置很多功能。koa是简洁和自由,只包含最核心的功能,不会对使用其他中间件进行任何限制。
他们两个核心都是中间件,但是他们处理中间件的执行机制是不一样的,尤其是针对异步操作的中间件。
现在有个需求,三个中间件都给res.message加东西,然后让第一个中间件输出结果
在这里插入图片描述
如果。在第一个next后加上res.end就可。
在这里插入图片描述为啥呢?看源码
在这里插入图片描述
这里面主东调了next函数,然后我们的中间件交给handle_request执行,中间件中
在这里插入图片描述
然后又调用next,所以有往下执行了,res.end就不会在next后执行。知道第三个没有next后。就回到第二个执行next后面的代码,然后再回到第一个执行next后面的代码。
处理异步的数据呢?
在这里插入图片描述
在这里插入图片描述
中间处理异步操作,没生效。因为express处理异步还是有点乏力,在这里插入图片描述

因为同步先执行完再执行异步
在这里插入图片描述
这就不能满足我们要在第一个中间件响应数据的要求了、
koa很好的处理了这一点。
koa框架的同步处理跟express一样的,处理异步就不一样了。
在这里插入图片描述
在这里插入图片描述
koa也是一样的,但是可以很好地处理,比如,koa的next()返回的是promise,所以可以await去调用在这里插入图片描述
在这里插入图片描述
如图,因为next返回的是一个prommise,所以可以使用async await很好的解决中间件异步的问题。这也是express和Koa一大区别。

以上是关于node.js系列10 koa2框架的主要内容,如果未能解决你的问题,请参考以下文章

最新Node.js框架:Koa 2 实用入门

知名Node.js框架系列之:我看面向特性的Thinkjs

Node.js 系列01

知名Node.js框架系列之:我看hapi(哈啤)

node.js系列 9 express框架核心用法以及源码

使用Koa2搭建web项目