KOA 之 原理及流程简介

序言

KOA 由Express 架构的原班人马打造的新型架构。 其特点:代码少,使用方便, 采用了async/await语法让开发者利用同步的方式编写异步代码等。
2.x版本支持ES7的语法。在编程中会显得更加简洁明了。
本章将通过个人学习总结的相关知识与大家分享,如有错误往指出。

KOA 基本原理流程图

首先来看看下面的流程图,有个主观的认识:
在这里插入图片描述

KOA 开发REST风格API

REST指的是一组架构约束条件和原则。 满足这些约束条件和原则的应用程序和设计就是RESTful

先来看看下面API场景:

// 获取操作使用get:
// 例如:获取全部文章
get /api/articles
// 带搜索条件带获取文章(例如页数、每页条数、文章类型等等)
get /api/articles?page=1=pageSize=50&type=1
// 获取id为12345带单条文章
get /api/articles/12345

// 资源分类,
// eg:获取id为12345的文章的评论
get /api/articles/12345/comments
// 获取id为12345的文章的带搜索条件的评论
get /api/articles/12345/comments?page=1&pageSize=50

// 提交数据使用post类型:
// 创建文章
post /api/articles
// 更新数据使用put类型:
// 例如:更新id为12345的文章内容
put /api/articles/12345
// 删除id为12345的文章
delete /api/articles/12345

koa开发REST风格的API
在koa中开发REST风格的API很简单, koa-router为我们的ctx对象提供了params对象,可以获取REST风格的API中的参数。 其实很像vue-router中的动态路由~

router.get('/user/:userId', async ctx => {
    // 获取动态路由的参数
    // 通过koa-router提供的ctx.params对象获取
    const id = ctx.params.userId
    // 省略其他代码
}
KOA 中间件

Koa-Session

Sesson 是另一种记录客户状态的机制, 其与Cookie 的区别是: 一个保存在客户浏览器中,一个保存在服务器上。

  • Session 的工作流程
    浏览器访问服务器并发送第一次请求时,服务器端会创建一个Session对象, 生成一个类似Key, Value 的键值key(cookie)返回到浏览器(客户)端, 浏览器下次再访问时, 携带key(cookie), 找到对应的Session(value)。
    官方提供的中间件文档:
const config = {
   key: 'koa: sess', // cookie key (default is koa:sess)
   maxAge: 86400000, // cookie 的过期时间  maxAge in ms (default is 1 days)
   overwrite: true, // 是否可以overwrite  (默认default true)
   httpOnly: true, // cookie 是否只有服务器端可以访问  httpOnly or not (default true)
   signed: true, // 签名默认true
   rolling: false, // 在每次请求时强制设置cookie, 将重置cookie过期时间 (默认: false)
   renew: false, // 当会话快过期是续订会话
}
app.use(session(config, app))

使用:

设置值: ctx.session.username = "xxxx";
获取值: ctx.session.username
  • Koa 中Cookie 和 Session 区别
  1. cookie 数据存放在客户端浏览器上, session 数据存放在服务器上;
  2. cookie 是不安全的, 可以通过分享本地cookie 进行cookie欺骗;
  3. session 会在一定时间内保存在服务器上。 访问增多时,比较占用服务器性能;
  4. 单个cookie 保存的数据不能超过4k, 很多浏览器都限制一个站点最多保存20个cookie.

Koa-body
功能齐全的正文解析中间件。 提供与Express的baodyParser相同的功能multer
一个官网demo:

index.js

const Koa = require('koa');
const KoaBody = require('koa-body');
const app = new Koa();
app.use(KoaBody());
app.use(ctx => {
   ctx.body = `Request Body: ${JSON.string(ctx.request.body)}`
})
app.listen(3000)

使用

node index.js
curl -i http://localhost:3000/users  -d "name=test"

Output:

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 29
Date: Wed, 03 May 2017 02:09:44 GMT
Connection: keep-alive
 
Request Body: {"name":"test"}%

一个文件上次的Demo

const koaBody = require('koa-body');
const app = new koa();
app.use(koaBody({
  multipart:true, // 支持文件上传
  encoding:'gzip',
  formidable:{
    uploadDir:path.join(__dirname,'public/upload/'), // 设置文件上传目录
    keepExtensions: true,    // 保持文件的后缀
    maxFieldsSize:2 * 1024 * 1024, // 文件上传大小
    onFileBegin:(name,file) => { // 文件上传前的设置
      // console.log(`name: ${name}`);
      // console.log(file);
    },
  }
}));

1)koa-body 的基本参数
参数名 描述 类型 默认值
patchNode 将请求体打到原生 node.js 的ctx.req中 Boolean false
patchKoa 将请求体打到 koa 的 ctx.request 中 Boolean true
jsonLimit JSON 数据体的大小限制 String / Integer 1mb
formLimit 限制表单请求体的大小 String / Integer 56kb
textLimit 限制 text body 的大小 String / Integer 56kb
encoding 表单的默认编码 String utf-8
multipart 是否支持 multipart-formdate 的表单 Boolean false
urlencoded 是否支持 urlencoded 的表单 Boolean true
text 是否解析 text/plain 的表单 Boolean true
json 是否解析 json 请求体 Boolean true
jsonStrict 是否使用 json 严格模式,true 会只处理数组和对象 Boolean true
formidable 配置更多的关于 multipart 的选项 Object {}
onError 错误处理 Function function(){}
stict 严格模式,启用后不会解析 GET, HEAD, DELETE 请求 Boolean true

2)formidable 的相关配置参数
参数名 描述 类型 默认值
maxFields 限制字段的数量 Integer 1000
maxFieldsSize 限制字段的最大大小 Integer 2 * 1024 * 1024
uploadDir 文件上传的文件夹 String os.tmpDir()
keepExtensions 保留原来的文件后缀 Boolean false
hash 如果要计算文件的 hash,则可以选择 md5/sha1 String false
multipart 是否支持多文件上传 Boolean true
onFileBegin 文件上传前的一些设置操作 Function function(name,file)

Koa-router

koa 路由库。
在Node 原生里面: 实现一个路由功能大致代码如下:

const http = require('http')
const { parse } = require('url')
const server = http.createServer((req, res) => {
    let { pathname } = parse(req.url);
    if(pathname === '/') {
       res.end('index page')
    } else if(pathname === '/tesdt') {
       res.end('test page')
    } else {
        res.end('router is not found')
   }
})
server.listen(3000)

在Koa-router 中: 如下:

const  Koa = require('koa');
const koaRouter = require('koa-router')

const app = new Koa();
// 创建 router 实例对象
const router = new KoaRouter();

// 注册路由
router.get('/', async(ctx, next) => {
   console.log('index');
   ctx.body = 'index'
});
app.use(router.routes()); // 添加路由中间件(为了让koa实例使用处理后的路由模块,需要使用routes方法将路由加入到应用全局的中间件函数中)
app.use(router.allowedMethods());// 对请求进行一些限制处理
app.listen(3000)

未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值