# Koa

# 什么是Koa

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 为搭建web服务器提供更轻量、更优雅的方案。 Koa目前的版本是koa2

# 与Express的区别

# 相同点

两个框架都对http进行了封装。相关的api都差不多,同一批人所写。

# 不同点

  1. 更轻量
  • koa没有内置的中间件
  • koa不提供路由匹配
  1. 更合理的对象结构
  • express的主要操作对象有appreqres; 图片
  • koa中,它的主要操作对象有appcontextrequestresponse 图片
  1. 更友好的中间件支持
  • express的中间件模型为线型,而koa的中间件模型为U型,也可称为洋葱模型构造中间件。
// express 的中间件示例
function delay(duration){
  return new Promise(resolve=>{
    setTimeout(()=>{
      resolve();
    }, duration)
  })
}
// 中间件1
app.use(function(req, res, next){
  console.log(1);
  next();
  console.log(4);
})

// 中间件2
app.use(async function(req, res, next){
  console.log(2);
  await delay(1000);
  console.log(3);
})

// 得到的结果:1 2 4 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
图片
// koa 的中间件示例
function delay(duration){
  return new Promise(resolve=>{
    setTimeout(()=>{
      resolve();
    }, duration)
  })
}
// 中间件1
app.use(async function(ctx, next){
  console.log(1);
  await next();
  console.log(4);
})

// 中间件2
app.use(async function(req, res, next){
  console.log(2);
  await delay(1000);
  console.log(3);
})

// 得到的结果:1 2 3 4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
图片

可以看到,对于每个中间件,在完成了一些事情后,可以非常优雅的将控制权传递给下一个中间件,并能够等待它完成,当后续的中间件完成处理后,控制权又回到了自己,这种中间件模型称之为洋葱模型

图片

# 常用中间件

Koa中间件 功能
@koa/router (opens new window) 官方中间件。借鉴了koa-router
用于处理路由的中间件,用法类似 express.Router
koa-bodyparser (opens new window) 解析请求体的中间件,支持
x-www-form-urlencoded, application/json格式的请求体
koa-views (opens new window) 渲染模板引擎的中间件,一般用于传统的服务端渲染
koa-static (opens new window) 用于搭建静态资源服务器的中间件
koa-static-cache (opens new window) 实现了http缓存的静态资源中间件
koa-session (opens new window) session中间件
koa-jwt (opens new window) 支持jwt的中间件
koa-compress (opens new window) 支持gzip动态压缩的中间件
koa-logger (opens new window) 日志记录中间件
@koa/cors (opens new window) 官方中间件。支持CORS跨域的中间件
@koa/multer (opens new window) 官方中间件,借鉴了koa-multer
用户处理文件上传的中间件
koa-connect (opens new window) 将express或connect中间件转换为koa中间件
http-proxy-middleware (opens new window) 代理中间件
connect-history-api-fallback (opens new window) 单页应用支持
koa-convert (opens new window) 用于将旧版本的koa中间件转换为koa2中间件