KOA介绍与使用

156 阅读4分钟

什么是Koa

官网:koajs.com/

民间中文网:koa.bootcss.com/

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

Koa目前的版本是koa2

对比 Express

更轻量

express的基础上进一步简化了框架

这些简化表现在下面两个方面:

  • koa没有内置的中间件
  • koa不提供路由匹配

更合理的对象结构

express的主要操作对象有appreqres,它们的逻辑关系如下:

image-20200615132605132

而在koa中,它的主要操作对象有appcontextrequestresponse,它们的逻辑关系如下:

image-20200615132844959

更友好的中间件支持

koa最大的优势,就是它支持异步中间件,从而提供了基于合理的中间件模型

// 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
image-20200615134901284

这会导致一系列的问题

koa是真正支持异步的中间件模型

// 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
image-20200615134918087

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

clipboard.png

官网:koajs.com/

民间中文网:koa.bootcss.com/

创建 Koa 应用

const Koa = require("koa");
const app = new Koa();
const http = require("http");
const server = http.createServer(app.callback());

server.listen(port, callback);
const Koa = require("koa");
const app = new Koa();

app.listen(port, callback);

注册中间件

app.use(middleware1);
app.use(middleware2);
app.use(middleware3);

中间件的函数格式如下:

function(ctx, next){
  // ctx 上下文对象
  // next 移交给下一个中间件的函数
}

context

context中包含4个重要对象:

  • reqhttp模块内置对象
  • reshttp模块内置对象
  • requestkoa封装的请求对象,用于获取请求传递的信息
  • responsekoa封装的响应对象,用户设置响应信息

Koa不建议你使用原生的对象,绝大部分情况下,都应该使用它封装的对象

响应流程

image-20200616112945546

当给body赋值时,Koa会将status自动赋值为200或204

简化 api

为了方便使用,Koarequestresponse中的很多成员提取到了context中,并使用访问器控制

cookie

Koa原生支持cookie,不需要安装其他中间件

ctx.cookies.set(name, value, [options]); // 设置cookie
ctx.cookies.get(name); // 获取cookie

Koa同样支持加密的cookie

app.keys = ['im a newer secret', 'i like turtle']; // 加密的多个秘钥
ctx.cookies.set(name, value, { signed: true}); // 设置加密的cookie
ctx.cookies.get(name, {signed: true}); // 解密cookie

Koa中的加密是利用第三方库KeyGrip完成的,该库使用多个秘钥,轮流用它们加密目标字符串,在解密时,选择合适的秘钥进行解密

这种叫做旋转加密的方式,更加难以破解。

自定义空间

有时,某些中间件希望添加一些额外的信息,以方便后续中间件处理,比如当前登录的用户信息

Koa建议把这些信息添加到ctx.state

该属性默认是一个空对象,专门提供给中间件开发者添加额外信息的

错误处理

Koa实现了EventEmitter,因此,它是通过注册事件的方式处理错误的

// 当中间件发生错误时,会抛出 error 事件
app.on("error", err=>{
  
})

你也可以手动的抛出该事件

ctx.throw([status], [msg], [properties])

由于Koa实现了EventEmitter,除了错误处理之外,还可以利用它做别的事情

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