什么是Koa
官网:koajs.com/
民间中文网:koa.bootcss.com/
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 为搭建web服务器提供更轻量、更优雅的方案。
Koa目前的版本是koa2
对比 Express
更轻量
在express的基础上进一步简化了框架
这些简化表现在下面两个方面:
koa没有内置的中间件koa不提供路由匹配
更合理的对象结构
express的主要操作对象有app、req、res,它们的逻辑关系如下:
而在koa中,它的主要操作对象有app、context、request、response,它们的逻辑关系如下:
更友好的中间件支持
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
这会导致一系列的问题
而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
可以看到,对于每个中间件,在完成了一些事情后,可以非常优雅的将控制权传递给下一个中间件,并能够等待它完成,当后续的中间件完成处理后,控制权又回到了自己,这种中间件模型称之为洋葱模型
官网: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个重要对象:
req:http模块内置对象res:http模块内置对象request:koa封装的请求对象,用于获取请求传递的信息response:koa封装的响应对象,用户设置响应信息
Koa不建议你使用原生的对象,绝大部分情况下,都应该使用它封装的对象
响应流程
当给body赋值时,Koa会将status自动赋值为200或204
简化 api
为了方便使用,Koa将request和response中的很多成员提取到了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-session | session中间件 |
| 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中间件 |