1. Koa 简介
koa是由Express原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的Web框架。使用koa编写web应用,通过组合不同的generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写Web应用变得得心应手
1.1 更小
koa 体积更小(500多行)、轻量。需要单独下载中间件配合开发。express 内置了很多中间件,集成度高。
1.2 富有表现力
需要编写的代码越少,程序就容易维护和调试。可读性高,编译器和人理解更简单。
1.3 更健壮
容错能力强,异常处理方便,程序不会挂掉,很好地抛异常。
2. 中间件机制
学习 Koa 重点在于理解中间件实现原理,对后续引用第三方库中间件时候有更好了解。
Koa的应用程序其实就是一个包含一组中间件函数的对象,通过app.use函数来加载中间件(也有引入顺序要求),这个函数有两个参数,context指的是上下文环境对象,封装了一些属性;next用于把中间件的执行权交给下游的中间件,在当前中间件中位于next()之后的代码会暂停执行,直到最后一个中间件执行完毕,再自下而上依次执行每个中间件中next值周的代码,类似于栈的先进后出。这种模型被称作“洋葱圈模型”。

简单的理解中间件呢,我觉得就是两边对称,举个例子:有个数组,奇数个也好,偶数个也罢。
const arr = [1, 2, 3, 2, 1]
程序从走向右执行,1 是一个中间件中的代码,同理 2 3。只是在两个 1 中间有个 next() 指向 2,2 中有个 next() 指向 3。但是 next() 执行完后还会回到当前的中间件(不知道是否解释清了,还是更乱了😂)
代码实现如下:
后面会详细介绍,大家先了解
// #1
app.use(async (ctx, next)=>{
console.log(1)
await next();
console.log(1)
});
// #2
app.use(async (ctx, next) => {
console.log(2)
await next();
console.log(2)
})
app.use(async (ctx, next) => {
console.log(3)
})
3. REST
3.1 介绍
REST 是一种风格,是个万维网软件架构的风格,用于创建网络服务。REST 不是指休息的意思,而是 Representational State Transfer 的缩写,即 —— 表现层状态转化。
- 表现层 把资源具体呈现出来的形式,比如文本可以用txt格式表现,也可以使用JSON格式、二进制格式表现。
- 状态
指的当前状态,状态可以改变,使用
put修改,使用delete删除等。 - 转化
通过
http协议,在客户端和服务端进行数据传输。
3.2 REST的6个限制
- 客户-服务器(Client-Server)(CS架构)
- 关注点分离:服务端专注于数据处理,增删改查;客户端专注页面的交互和用户体验。
- 简单性: 原来的服务端还需要渲染页面,MVC 模式,现在只需要关注数据,减少代码量
- 可移植性:页面可以方便的移到其他平台,一套代码,接口不变就没问题。
- 无状态(Stateless)
- 简单性:所有用户会话信息(用户信息)都保存在客户端,存在本地缓存。不需要由服务端存储记录
- 可见性:客户端每次请求必须包括所有信息,不能依赖上下文信息
- 可靠性:前后端完全依靠接口,比较独立,系统稳定
- 缓存(Cache)
- 所有服务端响应都要被标为可缓存或不可缓存(cache-control)
- 减少前后端交互,提升了性能(
js文件,css文件都可以本地缓存)
- 统一接口(Uniform Interface)
- 接口设计尽可能统一通用,提升了简单性、可见性(简单、易学、易维护)
- 接口与实现解耦,使前后端可以独立开发迭代(开发人员不用在一块,有电脑依靠文档就可以实现快速开发)
- 分层系统(Layered System)
- 每层只知道相邻的一层,后面隐藏的就不知道了(前端只知道接口,不了解后面可能存在的代理服务器)
- 其它层:安全性、负载均衡(流量分发)、缓存层等
- 按需代码(Code - On - Demand 可选)
- 客户端可以下载运行服务器传来的代码(比如
js,使用eval执行) - 常用的不会变的代码放在服务器,减少一些功能,简化了客户端
- 客户端可以下载运行服务器传来的代码(比如
3.3 统一接口子限制
- 资源的标识
- 资源是任何可以命名的事物,如用户,评论
- 每个资源可以通过URI唯一标识 https://api/github.com/users https://api/github.com/users/day
- 表述操作资源
- 客户端不能直接操作服务端资源,通过传
json操作
- 自描述信息
- 每个消息(请求或相应)必须提供足够的信息让接受者理解
- 媒体类型(application/json)
- 合理使用 http 方法,get(查), post(增),delete(删)等
- 是否缓存: cache-control
- 文字链接用于网页跳转
3.4 REST 设计规范
- 具体什么样子
- 基本的
URI格式,如https://api.github.com/users - 标准
http方法,如get, post, put, patch, delete - 传输的数据媒体类型,如
JSON
- 符合
REST架构风格的api
- get /users: 获取用户列表
- get /users/day 获取用户详情
- delete users/1 删除
id为1的用户 - put/patch users/1 更新
id为1的用户的信息
put和patch的区别:patch 部分更新,put 整体替换
- 响应设计规范
-
查询(后台负责接收参数返回数据)
-
分页(查询的一种),长列表时,优化页面显示,分页返回
-
字段过滤(查询的一种),如果前端不需要的数据可以不用返回,返回指定的字段,减少数据量
-
状态码
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL.
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
-
错误处理
- 输出
JSON格式错误信息。如果状态码是4xx或者5xx,就应该向用户返回错误信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可
- 输出
-
安全
- https
- 鉴权,有些页面需要先登录才能查看
- 限流,防刷(做个中间层)
http头部加了limit字段,记录请求次数,如果超过,报错。也可以提示登录后获得更多的限流值
-
开发者友好 - 提供接口文档