koa2

一、koa2

  • 框架:封装原生代码的API,规范流程和格式,提高开发效率(让开发更加关注业务代码)
  • 框架与库的区别:
    (1)框架是唯一的,库是可以共存
    (2)框架关注全流程,库关注单个功能
  • koa2是nodejs web server框架
    (1)官网:https://koa.bootcss.com/
    (2)通过async/await语法高效编写web server
    (3)中间件机制,合理拆分业务代码
    (4)安装:npm install koa --save

  • koa2体验

const Koa = require('koa')
const app = new Koa()
 
// contrxt =>ctx 联系上下文
app.use(async (ctx)=>{
    ctx.body = 'hellp world'
}).listen(3000) // web server 监听3000端口 
  • 环境搭建
    (1)使用脚手架koa-generator创建koa2项目npm install -g koa-generator
    (2)安装完之后,使用命令koa2 --version或者koa2 -V检测是否安装成功,安装成功出现版本号,如下:安装与测试图片。
安装

测试

(3)创建koa2项目。执行命令koa2 文件名 ,然后cd进入创建好的文件夹。例:

创建项目

(4)项目运行 创建项目之后,本身有nodemon插件,直接使用npm run dev运行即可
image.png

(5)app.js中导出的app实列在bin下的www中引入
(6)www中监听的3000端口
(7)app.use后面引用的都是"中间件"

  • 定义路由,设置问及那名:comment.js
    (1)引入koa-router,例:const router = require('koa-router')()
    (2)设置前缀
    (3)输出:module.exports = router //输出
    (4)使用``router.get`,整体可参考如下:
const router = require('koa-router')()

router.prefix('/api')// 前缀

// 定义路由:模拟获取留言板列表
router.get('/list',async (ctx)=>{
  ctx.body = "api list"
})

// 创建留言板的路由 ,注意:创建get请求用get,创建post请求用post
router.post('/create',async (ctx)=>{
  ctx.body = 'api create'
})
module.exports = router //输出

(5)创建好了路由,在app.js中先引入,然后注册。,例:


引入
注册

(6)注册里面的allowedMethods()是对于404 或者返回是空的情况的一种补充

二、koa2处理http请求

  • 如何接收数据和返回数据:
    ctx即:res和req的 集合
    (1) 获取querysting(url后面的参数)


    获取querstring,字符串格式

    获取json格式的

(2)获取request body


js中代码书写
postman发送json数据

cmd结果

三、koa2中间件

  • 什么是中间件:
    (1)一个流程上,独立的业务模块
    (2)可扩展,可插拔
    (3)类似于工厂的流水线
    (4)如下,每一个功能模块就是一个中间件


    中间件
  • 为什么使用使用中间件
    (1)拆分业务模块,使代码更加清晰
    (2)统一使用中间件,使各业务代码都规范标准
    (3)扩展性好,易添加、易删除

  • 所有的app.use(...)都是中间件、路由也是中间件(只不过限制了url的规则????);就是说,路由根据url的规则走

  • 模拟登录验证

// 模拟登录(为了使用中间件)app.use所有操作都会经过的
app.use(async (ctx, next) => { // next下一步,该use的下一个中间件,next
  const query = ctx.query
  if (query.user === 'zhangsan') {
    //模拟登录成功
    await next() // 执行下一步中间件 。await等待,等待异步执行完,才会执行完下面的代码
  } else {
    // 模拟登录失败
    ctx.body = '请登录'
  }
})

四、洋葱圈模型

  • 每个中间件都是async函数(函数运行机制,没讲过。)
  • 每一层洋葱圈都是一个中间件(先进入哪一个中间件,最后从那个中间件出)


    洋葱圈模型
  • 回顾async/await
    (1)await调用的时候,需要等当前执行完之后,才可以往下执行。类似开发的时候,等待一个结果,必须拿到结果之后,才可以继续使用执行。
    (2)fetch 原生api,一种HTTP数据请求的方式,是XMLHttpRequest的一种替代方案。类似与ajax,发送请求用的。所以外层调用的时候需要等待一个结果。
    (3)代码演示,不完整,只是一个执行顺序。
// 演示async await 的执行顺序
// 代码放在浏览器中运行。

// 加载一张图片。使用async声明函数。
async function getImg(url = '') {
  await fetch(url)
  // fetch 原生api,一种HTTP数据请求的方式,是XMLHttpRequest的一种替代方案。类似与ajax,发送请求用的
}

async function fn(){
  const url = 'https://upload-images.jianshu.io/upload_images/19813229-97dc09156676ab94.png'
  const start = Date.now() // 记录当前时间
  await getImg(url) //调用getImg,加载图片 
  // await调用的时候,进入getImg函数,等getImg函数执行完之后(这行代码才算执行完),才会执行下面的代码

  const ms = Date.now() - start // 计算时间差。
  console.log(`加载图片时间:${ms}`)
}
fn()
  • 演示koa2中间件的洋葱圈模型,代码示例:
// 演示koa2中间件的洋葱圈模型
const Koa = require('koa')
const app = new Koa()

// logger 
app.use(async (ctx, next) => {
    await next()  // 执行下一个中间件(对于当前来说是x-response-time)
    const rt = ctx.response.get('X-Response-Time') //res 。get获取时间差
    console.log(`${ctx.method} ${ctx.url} - ${rt}`)
})

// x-response-time
app.use(async (ctx, next) => {
  const start = Date.now()
  await next()
  const ms = Date.now() - start
  ctx.set('X-Response-Time',`${ms}ms`) // X-Response-Time与上一个中间件res这里的要一致
  //  set 记录/设置 时间差
})

// response
app.use(async (ctx, next) => {
  ctx.body = 'Hello 洋葱圈'
})

app.listen(3000) 
console.log('监听3000端口')
过程
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343